CUrlManager::addRules
5 августа 2010
Довольно часто на форумах спрашивали, как добавить свои правила роутинга не из конфига, а, например, из БД или XML, лежащего в модуле.
Теперь это можно сделать при помощи CUrlManager::addRules. Вызывать его необходимо до CWebApplication::processRequest. Всё, что будет добавлено позже будет проигнорировано.
Одним из способов это сделать является использование событий. В данном случае CWebApplication::onBeginRequest.
Например, для подгрузки правил из модулей в main.php пишем:
'onBeginRequest'=>function($event){ $route=Yii::app()->getRequest()->getPathInfo(); $module=substr($route,0,strpos($route,'/')); if(Yii::app()->hasModule($module)) { $module=Yii::app()->getModule($module); if(isset($module->urlRules)) { $urlManager=Yii::app()->getUrlManager(); $urlManager->addRules($module->urlRules); } } return true; },
Код уже ушёл в SVN.
Комментарии RSS по email OK
Данная возможность войдет в следующий релиз yii?
уже вошла!
CHANGELOG
Version 1.1.4 to be released
...
...
Александр, не расскажешь поподробнее насчет планов развития, а то ты в твиттере написал совсем коротко)
я про версии
Не, пока рано.
У меня давно в сайтах используется такое расширение:
Вот для того, чтобы не делать много раз init(), который довольно ресурсоёмок, можно воспользоваться новым способом.
спасибо за полезную вещь, только непонятно как правильно вписывать в конфиг файлах, где эти конфиги должны располагаться и после какого кода и до какого?
К примеру есть модуль Новость располагается он тут modules/news/
где есть основной файл NewsModule.php я так понял правила нужно где-то в этом файле вписать или как-то по другому?
Спасибо за разъяснение.
В данном примере правила пишутся в свойство urlRules модуля.
а это как в свойствах?
извиняюсь за глупый вопрос...
тоесть таким образом можно прописать правила в отдельном каталоге в файле допустим modules/news/config/router.php для каждого конкретно отдельного модуля?
Можно.
можете немного подробнее описать как это сделать, уж извините что задаю много вопросов по одной и той же теме.
Буду очень вам благодарен за помощь, спасибо
По аналогии с кодом в посте. Только вместо загрузки самого модуля надо считать данные из его конфига.
ох и горе наверное со мной, не получается у меня ни как
делаю так, в файле modules/news/NewsModule.php приписываю такой код
но когда пытаюсь зайти выдаёт
CHttpException / 404 Невозможно обработать запрос
код что в посте у вас указан прописал в основном конфиге main.php сразу над кодом
извиняюсь за большой код
Он должен быть наравне с секцией components, а не в ней.
Спасибо. Давно искал решение проблемы с модулями и правилами URL.
Есть возможность задать обработчик для onBeginRequest не только через конфиг (main.php)? Потому что иметь код в конфиге имхо не очень красиво: 'onBeginRequest' => create_function('$event', 'die("a");')
Так же как я понял в контроллере задать обработчик начала реквеста тоже не получится, т.к. его вызов (контроллера) происходит уже после этого события?
Да, конечно есть. Почитать можно в рецепте «События». В контроллере не получится. Можно, например, в index.php.
Здравствуйте. Только что использовал ваш метод маршрутизации url для модулей, но 404. Скажите может что-то не так делаю?
В модуле
В конфиге
и вставил событие onBeginRequest в точности как у вас в 1 уровне вложенности. Кто нибудь скажите, может что-то я не дописал?
Андрей, нужно убрать rules из конфига 'urlManager' => ...
увы но нет, я решил проблему, оказывается порядок загрузки модулей тоже влияет, на это. Т.к. правила одного модуля могуг перекрывать правила из другого.
Кто-нибудь не сталкивался с проблемой, когда используются виджеты модуля в другом модуле? Правила берутся только у текущего модуля, а виджет может быть использован в любом модуле, и он не подгрузит нужные правила..
Адрес /blog/index парсер с substr возьмёт, а просто /blog - нет. Можно заменить на
Про это же и про импорт правил для виджетов затронул тему у себя.