Перехват ошибок 404, 403, etc.

Всем привет

Очень рад открытию русскоязычной ветки на официальном форуме Yii!

По ходу столкнулся с небольшим неудобством при перехвате ошибок.Допустим, мы хотим получить запись с несуществующим id в таблице.После, если ее действительно нет, бросаем эксепшн

throw new CHttpException(XXX, 'Ой, записи не найдено!')

Все дело в том, что Yii просто полностью рендерит файлик в protected/views/system/errorXXX.php и отдает ответ.

Вопрос - можно ли при возникновении подобных эксепшенов вызывать контроллер, скажем ErrorController и его действие actionerrorXXX()?

Придется наследовать свой класс от CHttpException и там уже перегружать конструктор с вызовом этого контроллера?

Вопрос хороший… Принципиальное решение такое. Тут не контроллер нужен, а надо наследовать свой класс от http://www.yiiframew…/CErrorHandler, зарегистрировать его в конфиге приложения (для этого надо написать что-то типа ‘errorHandler’ => array(

'class' => 'path.to.class',

)

Вот только ID компонента обраотки ошибок я не знаю, может там и не errorHandler. Тут или по фреймворку лазить, или на форуме английском спрашивать.

А в своем классе обработки ошибок ты должен создавать тот контроллер. который хочешь (чтоб он был доступен, надо его сначала импортировать: Yii:import()) И потом вызвать нужное действие.

А вообще, для случаев типа “не найдено” лучше че-то попроще придумать :)

Но если будешь реализовывать через наследование стандартного обработчика - напиши как сделал, очень интересно.

Если с английским неважно - я могу спросить на англ форуме, но завтра, щас уже спать надо :)

Quote

Вопрос хороший... Принципиальное решение такое. Тут не контроллер нужен, а надо наследовать свой класс от http://www.yiiframew.../CErrorHandler, зарегистрировать его в конфиге приложения (для этого надо написать что-то типа 'errorHandler' => array(

'class' => 'path.to.class',

)

Вот только ID компонента обраотки ошибок я не знаю, может там и не errorHandler. Тут или по фреймворку лазить, или на форуме английском спрашивать.

А в своем классе обработки ошибок ты должен создавать тот контроллер. который хочешь (чтоб он был доступен, надо его сначала импортировать: Yii:import()) И потом вызвать нужное действие.

А вообще, для случаев типа “не найдено” лучше че-то попроще придумать :)

Но если будешь реализовывать через наследование стандартного обработчика - напиши как сделал, очень интересно.

Если с английским неважно - я могу спросить на англ форуме, но завтра, щас уже спать надо :)

Ага, надо попробовать оба варианта, спасибо на наводку. Чуть позже отпишусь :)

My english is quite normal, so thank you for help - I'll ask those guys myself if needed.

что в итоге получилось?

С версии 1.0.6 (кажется) был доработан функционал и теперь можно не изощряться, а настроить конфигурацию приложения сразу:


return array(

    ......

    'components'=>array(

        'errorHandler'=>array(

            'errorAction'=>'site/error',

        ),

    ),

);

Таким образом, мы настроили перехватчик вех ошибок - экшн Error контроллера SiteController.

http://www.yiiframework.com/doc/guide/topics.error

спасиб =)

А после перехвата ошибки, могу я вызвать её стандартную отрисовку?

Мне нужно при 404 ошибке делать определённый экшен, а при всех остальных ошибках выводить стандартные монологи.

Конечно! В контроллере-перехватчике узнаем код ошибки и затем:


...

$this->layout = '';

$this->render('application.system.404');

либо рендерим нужное представление.

Спасибо, для точности код выглядит так:


...

if($error=Yii::app()->errorHandler->error) {

	if($error['code']==404) {

		echo 'action';

		exit();

	} else {

		$this->renderPartial('system.views.error'.$error['code'], $error);

	}

}

Но возник другой вопрос. Да при возникновении ошибки функция вызывается и выводится сообщение ‘action’. Но при этом страница отдаётся с заголовком ‘404 CHttpException’ и становится “красной” в firebug-е. Могу я при возникновении ошибки выдать обычную страницу (без заголовков с ошибками)?