Yii2: Обработка ошибок

 

Обработка ошибок в Yii 2

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *