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

В классе плагина есть метод 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. Хотелось повеселе, но вышло увы не очень :)