Динамическая обработка URL (поиск URL в базе)

Здравствуйте

Осваиваю Yii и столкнулся с проблемой. Опишу ситуацию:

Есть несколько контроллеров (моделей), которые обрабатывают разные типы материалов сайта. Например, Post - посты блога, Pages - отдельные страницы сайта. Я хочу, чтобы к любому материалу можно было задавать любой url.

Т.е. например пишу новый пост в блог и задаю ему URL: my-megapost/of/blog. Или создаю страничку "О сайте" и задаю ей произвольный URL типа: company/all/about/us.

Эти URL соответственно хранятся в базе.

В main.php у меня прописано примерно следующее:

    'urlManager'=>array(


			'urlFormat'=>'path',


			'rules'=>array(


				'blog/<id:d+>'=>'post/show',


				'blog/<id:d+>/update'=>'post/update',

Т.е. заданы какие-то 'статические' правила для URL'ов.

Я хочу чтобы при каком-либо запросе, URL сначала проверялся по тем правилам, которые заданы в 'rules', в случае промаха (ни одно правило не подошло) запрашивался бы контроллер соответствующий запросу (как сейчас и происходит) и если такого контроллера нету, то тогда вызывалась бы моя функция, которая уже обращалась к базе и смотрела есть ли в базе такой URL.

Каким образом реализовать подобное? В каком направлении копать?

Пока что я дошел до того, что нужно переопределить функции runController и createController класса CWebApplication. Которые как раз вроде бы и отвечают за поиск и создание нужного контроллера. Но мне кажется, что должно быть более корректное решение проблемы  :)

p.s. Просто так писать в 'rules' правило вида '<url:.+>'=>'site/default' не хочется, так как при этом запросы (action'сы) не прописанные в 'rules', но существующие, обрабатываются некорректно.

Посмотри расширение http://www.yiiframew…on/friendlyurl/ . Можно замутить что-нибудь наподобие этого

Это как вариант. Я реализовывал по другому - на примере постов блога или новостей:

Есть котроллер NewsController.php с actionShow который показывает новость, у каждой записи в базе есть поле altname в которое я записываю url который хочу и в rules я указываю или blog/<id:\d+> => post/show и blog/<alt:\w+> => post/show. Получаем урлы вида localhost/blog/bla-bla-bla.html или localhost/blog/1.html если не указали altname

Но это только в случае новостей или прочей фигни, если же нужны страницы, то тут как ты сам написал - '<url:.+>'=>'site/default' (это прописывай в конце rules, дабы все предыдущие правила тоже отработали)

На счет запросов которые не указаны в rules, но существующие в контроллере - добавь к названию "_", чтобы они не обрабатывались.

Посмотри как тут реализованы различные подставные url

cmssitestructuremodule

Стало интересно, посмотрел и удивился. Реализовано через обработчик ошибок. Т.е. если возникла ошибка 404, то управление передается CMS. Плюс - позволяет использовать модуль совместо со своими контроллерами и url правлами. Но ведь в любом из своих контроллеров я могу выкинуть ошибку 404. В этом случае модуль будет инициализрован, будет сделана выборка из БД и т.д.? Если так, то не очень хорошая затея, либо не до конца продуманная. Но сама идея мне показалась довольно остроумной :)

Вообще всё выглядит довольно опрятно, даже не смотря на то, что модуль у меня в убунте накидал кучу ошибок необъявленных переменных, а некоторые страницы вообще отказались работать :lol: Правки в исходном коде помогают, но когда наткнулся на использование $_GET внутри моделей, то понял, что CMS явно не заслуживает внимания на данном этапе своей жизни, уж простит меня её автор :)