Роутинг плагина: хук, баги и шутки WA за 100

enso_studio@mail.ru

В классе плагина есть метод routing:

class waPlugin
{
    public function routing($route = array())
    {
        $file = $this->path.'/lib/config/routing.php';
        if (file_exists($file)) {
            /**
             * @var array $route Variable available at routing file
             */
            return include($file);
        } else {
            return array();
        }
    }
}

который делает тоже самое что и хук 'routing', но благодаря ошибке в документации (которую уже месяц "исправляют") большинство плагинов его успешно переопределяет даже не задумываясь о этом.

Более того бедный метод игнорируется самими WA чуть больше чем полностью:

class siteConfig extends waAppConfig
{
    public function getRouting($route = array(), $dispatch = true)
    {
        if ($this->_routes === null || $dispatch) {
            $routes = parent::getRouting($route);
            /**
             * Extend routing via plugin routes
             * @event routing
             * @param array $routes
             * @return array routes collected for every plugin
             */
            $result = wa()->event(array('site', 'routing'), $routes);
            ....
    }
}

т.е. в список попадают только роуты плагинов реализующих хук.

Вы наверно думаете что, есть не добавить плагину хук routing или не указать 'frontend' => true в plugin.php, то waPlugin::routing() вызываться не будет? А вот и не угадали! Роуты срабатываю (проверено), вот только учитываются, как показано выше, не везде. К чему это приводит? Правильно, к багам...

Кстати с routing.php есть еще пара забавных моментов:

WA проверяют плагины автоматически с помощью wa.php compress, поэтому использование $this->... и других переменных метода routing вызывает ошибку и WA отклоняет публикацию, заявляя об ошибке в плагине, хотя ошибка в их коде проверки. Игнорируется и то, что в документации написано:

В routing.php в отдельных случаях допустим простой код, если без него нельзя обойтись.

т.е. использование заявленного в waPlugin::routing():

/**
 * @var array $route Variable available at routing file
 */

или $this->id, уже "сложный" код :)

Думаете с хуком routing нет проблем? И Вы снова ошибаетесь:

Входящие параметры $params array Массив стандартных правил маршрутизации приложения

из этого правда только то, что параметр является массивом.

Посмотрите приведенный выше siteConfig::getRouting() - все ок, переданы роуты приложения.

Теперь посмотрим что передается в shopConfig::getRouting():

/**
 * Extend routing via plugin routes
 * @event routing
 * @param array $routes
 * @return array $routes routes collected for every plugin
 */
$result = wa()->event(array($this->application, 'routing'), $route);

роуты приложения превращаются в конфиг(роутом это назвать сложно) витрины:

array(
  'url' => '*',
  'app' => 'shop',
  'theme' => 'default',
  ...
  'shipping_id' => '0',
)

благодаря приложению apps получаем неутешительную статистику:

event(array('site', 'routing'), $routes)
event(array('photos', 'routing'), $routes)
event(array('contacts', 'routing'), $routes)

event(array('blog', 'routing'), $route)
event(array('shop', 'routing'), $route)
event(array('hub', 'routing'), $route)
event(array('crm', 'routing'), $route)


Думаете WA никто не сообщал о этих багах? Нет, они их либо игнорируют, либо заявляют "це не баг - це фича" и пофиг на то, что не соответствует их же документации.

Подводя итог

разработчик, помни - зачастую твой плагин держится на трех китах WA: ошибках кода, ошибках документации и принципе "зачем исправлять старое, лучше добавить что-то новое".

P.S. Хотелось повеселе, но вышло увы не очень :)

27 июня 2018


    Чтобы добавить комментарий, зарегистрируйтесь или войдите