Обработчик ошибок включен в Yii 2 по умолчанию. Отключить его можно добавив следующий код в стартовый скрипт приложения web/index.php:
// Отключение обработчика ошибок Yii2 define('YII_ENABLE_ERROR_HANDLER', false);
Конфигурация по умолчанию
В шаблонах приложений Yii 2 basic и advanced обработчик ошибок подключен как компонент приложения errorHandler. Рассмотрим примеры конфигурации:
- приложение basic: config/web.php;
- приложение advanced: индивидуальные настройки для каждого из приложений frontend/config/main.php и backend/config/main.php.
Минимальная конфигурация обработчика ошибок использует site/error для отображения ошибок и исключений.
return [ // ... 'components' => [ // ... 'errorHandler' => [ 'errorAction' => 'site/error', ], // ... ], // ... ];
В данном случае нет необходимости в явном создании действия actionError в контроллере SiteController. Если заглянуть в файл SiteController.php, можно увидеть, что там использовано встроенное действие yii\web\ErrorAction, которое отображает информацию через представление views/site/error.php.
// SiteController.php class SiteController extends Controller { // ... public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', ], // ... ]; } // ... }
Настройка представления и шаблона
Возьмем за основу вышеописанную стандартную конфигурацию.
Представление описывается свойством view класса yii\web\ErrorAction:
// SiteController.php class SiteController extends Controller { // ... public function actions() { return [ 'error' => [ 'class' => 'yii\web\ErrorAction', 'view' => '@app/views/site/custom-error-view.php' ], // ... ]; } // ... }
В тоже время, шаблон для вывода сообщений об ошибках, можно изменить двумя способами:
1. Явно указав нужный шаблон в файле представления:
// custom-error-view.php $this->context->layout = 'custom-error-layout';
2. Указать шаблон в методе beforeAction() класса SiteController:
// SiteController.php public function beforeAction($action) { if ($action->id == 'error') { $this->layout = 'custom-error-layout'; } return parent::beforeAction($action); }
Свой обработчик ошибок
При необходимости, возможно создание своего метода для обработки ошибок. Например, создадим действие site/fault в контроллере SiteController:
// SiteController.php public function actionFault() { $exception = Yii::$app->errorHandler->exception; if ($exception !== null) { $statusCode = $exception->statusCode; $name = $exception->getName(); $message = $exception->getMessage(); $this->layout = 'custom-error-layout'; return $this->render('custom-error-view', [ 'exception' => $exception, 'statusCode' => $statusCode, 'name' => $name, 'message' => $message ]); } }
И подключим его в конфигурационном файле:
return [ // ... 'components' => [ // ... 'errorHandler' => [ 'errorAction' => 'site/fault', ], // ... ], // ... ];
Готово. Теперь все ошибки будут обрабатываться новым методом actionFault() контроллера SiteController.
Можно удалить описание ненужного действия site/error:
// SiteController.php class SiteController extends Controller { // ... public function actions() { return [ // Comment out or remove following error configuration // 'error' => [ // 'class' => 'yii\web\ErrorAction', // 'view' => '@app/views/site/custom-error-view.php' // ], // ... ]; } // ... }