Контроллер по умолчанию

Надо мне для одного проекта сделать следующее.

Есть маршрут к примеру:

/cat/<url> => ‘<url>/index’

Т.е. то что указанно после url - является именем контроллера в который мы обращаемся. Мне надо сделать что б если такого контроллера не существует - что б переводило в контроллер по умолчанию, некий CatController.php, а если существует то соотвественно "<Url>"Controller.php

Проблема легко решаема если все посылать в один контроллер по умолчанию, который в экшинсе index проверял бы существование переданного в "<url>" значения и отталкивался от этого. Но так не интересно. Возможно кто то знает способ встроенный в маршруты для этого?

Если кстати кто подскажет метод который проверяет существует ли заданный контроллер - буду весьма признателен. class_exist() и поиск по папке не в счет ;)

Если контроллера нет, то вызывается CHttpException с 404 ошибкой - напиши свою обработку этой ошибки и будет тебе счастие.

Писать обвертку отталкиваясь от словленной ошибки не самое верное мне кажется :) Темболее если на рабочих проектах ставятся заглушки от 404 и тп.

Просто в старых версиях Yii точно помню что при отсутствии контроллера - так и писало. Мол TestController не найден. А вот в новых версия пишет что путь не существует.

Да, стремно, смысл который в него вложили он не выполняет.

Контроллер по умолчанию вызывается только, когда пропущен ID контролера :(.

Yii как раз это и делает, причем захардокодили, не вынесли в отдельную функцию.

src: web/CWebApplication.php line 375

реализация функции runController в принципе проста и не замудрена, если только отнаследоваться от CWebApplication

и переопределить runController:




    public function runController($route)

    {

        try

        {

            parent::runController($route);

        }

        catch(CHttpException $e)

        {

            if(404 == $e->statusCode && $this->defaultController != '')

            {

                $this->runController($this->defaultController);

            }

            else

            {

                throw $e;

            }

        }

    }



Вот теперь defaultController выполняет полностью ту функцию которую, на него возложили.

Почему то думал здесь defaultController такой же как в perl фреймоврке CGI::Application.