
Обработчик ошибок включен в 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'
// ],
// ...
];
}
// ...
}