Свои классы для правил роутера Yii
24 мая 2011
В следующей версии Yii появится возможность использовать свой класс для конкретного правила роутера:
array( // стандартное правило CUrlRule '<action:(login|logout)>' => 'site/<action>', // свой класс array( 'class' => 'application.components.MyUrlRule', 'connectionID' => 'db', ), )
Это позволит, например, с лёгкостью реализовать такую штуку, как наличие потенциально конфликтующих URL:
/about /contact /my-cool-blog-post /my-cool-static-page
Код уже в транке, если есть желание или необходимость — можете опробовать. Замечания и предложения приветствуются.
Комментарии RSS по email OK
о да, круто. этого то мне и не хватало. Приходилось выкручиваться строгими правилами именования. спасибо.
Хорошая вещь, надо забирать из транка.
Как насчёт скорости? Ведь правила не слишком быстрые из-за регулярок, а с классом должны быть быстрее? А как на практике?
Практики пока особо не было. Если есть время — можете сравнить.
Клевая фича, теперь можно будет легко роуты из бд брать.
Сможете привести пример использования своего класса где роут берется из БД?
Код привожупримерный, чтоб была понятна идея
Думаю идея понятна. Детальней пока не могу описать.
из последнего примера, получается что при каждом переходе по УРЛ, будет обращение к БД для сверки УРЛ? а можно как то проще сделать, сохранять правила в отдельный файл и его когда нужно подключать для проверки.
В идеале у меня в планах сделать что то вроде такого, имеются разные модули, расположены в отдельных директориях, которые хранят в себе отдельный файл правил к примеру rule.php в нём будет содержаться массив правил. Далее пишется обработчик, который пробегается по всем модулям и собирает из rule.php правила, и заносит их в общий массив. ну и отдаёт системе. Вот как то так хотелось. Возможно ли такое?
А что мешает один раз забрать из базы правила и закешировать в тоем же мемкеше или редисе?
ну тоже вариант, удобно, но с одной стороны, а вот если система модульная, и в базе хранить правила думаю совсем не удобно, проще с файлов собирать данные. Модуль просто кидается в соответствуюю модульную директорию, и от туда обработчик автоматически забирает правила(после можно и кэш примерить), а то нужно дополнительно писать для импорта правил в базу данных. Да и через файлы удобнее править, для базы нужно интерфейс реализовывать.
Александр, данная возможность позволяет реализовать вообще всё, что угодно. То есть в класс попадают все запросы, а он уже решает, его это правило или нет и, если его, что с ним делать.
Sam, да всё верно, надо просто вникнуть и разобраться, это я так с лёту, с глупыми вопросами. Единственное хотел попросить если ни кого не затруднит, подсказать что прописать у функции createUrl из выше приведённого кода, что и с чем нужно сравнить, и что подставить в качестве успешного результата, переменную/функцию. То что в случаи ложности нужно прописать return false я понял. А так всё понятно.