Yii2. Робота з Error Handler (обробник помилок)

3 жовтня 2024 р. 31 egor

Розберемо докладний приклад обробки, налаштування і кастомізації помилок (Error Handler) в Yii2

Вмикаємо/вимикаємо повідомлення про помилки

У Yii2 обробник помилок за замовчуванням увімкнений. Вимкнути його можна так, відкрийте файл @app/web/index.php і додайте такий код:

// Yii2 вимкнути error handler
define('YII_ENABLE_ERROR_HANDLER', false);

Налаштування за замовчуванням

За замовчуванням у Yii2 вже є готовий до використання обробник помилок.

Обробник помилок у Yii2 називається errorHandler. Його налаштування знаходяться в:

  • для Yii basic - yourProject/config/web.php
  • Yii advanced - yourProject/common|backend|frontend/config/main.php

Наприклад, за замовчуванням обробник помилок використовує дію site/error для виведення помилок і винятків:

return [
    // ...
    'components' => [
        // ...
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        // ...
    ],
    // ...
];

У такому разі немає необхідності описувати дію error в контролері SiteController. Оскільки Yii2 використовує ErrorAction за замовчуванням, який вшитий у фреймворк. SiteController.php:

class SiteController extends Controller
{
    // ...
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            // ...
        ];
    }
    // ...
}

За замовчуванням yii\web\ErrorAction буде використовувати для виведення помилок подання (view): yourProject/views/site/error.php

Налаштування подання (view) при конфігурації за замовчуванням

Припустимо, що використовується конфігурація за замовчуванням. В yourProject/config/web.php або yourProject/frontend|backend/config/main.php:

return [
    // ...
    'components' => [
        // ...
        'errorHandler' => [
            'errorAction' => 'site/error',
        ],
        // ...
    ],
    // ...
];

У контролері SiteController додатка yourProject/controllers/SiteController.php:

class SiteController extends Controller
{
    // ...
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
            // ...
        ];
    }
    // ...
}

Кастомізуємо подання (view) виведення помилок

Використовувати своє подання (view) для виведення помилки дуже просто, достатньо додати шлях до view у налаштування SiteController метод actions елемент масиву error. Він перекриватиме властивості yii\web\ErrorAction, файл SiteController.php:

class SiteController extends Controller
{
    // ...
    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
                'view' => '@app/views/site/myerror.php'
            ],
            // ...
        ];
    }
    // ...
}

Кастомізуємо layout виводу помилок

Для вирішення цього завдання у нас є 2 варіанти.

1-й варіант

Вказати розташування подання (view) про помилку безпосередньо. Наприклад призначити окремий layout для виведення view помилки:

// Your error view yourErrorView.php
$this->context->layout = 'error_layout';

2-й варіант

Призначити layout для помилок у методі beforeAction контролера SiteController, SiteController.php:

public function beforeAction($action)
{
    if ($action->id == 'error') {
        $this->layout = 'error_layout';
    }
    return parent::beforeAction($action);
}

Використання кастомізованої дії (action) для виведення помилок

Так само ви можете написати свій власний метод дії обробки помилок і використовувати власне view або layout для відображення інформації про помилку.

Наприклад створіть дію myerror в контролері SiteController і використовуйте її як метод обробки помилок, SiteController.php:

class SiteController extends Controller
{
    // ...
    public function actionMyerror()
    {
        $exception = Yii::$app->errorHandler->exception;
        if ($exception !== null) {
            $statusCode = $exception->statusCode;
            $name = $exception->getName();
            $message = $exception->getMessage();
            $this->layout = 'your_error_layout';
            return $this->render('yourErrorView', [
                'exception' => $exception,
                'statusCode' => $statusCode,
                'name' => $name,
                'message' => $message
            ]);
        }
    }
}

Далі закоментуйте або видаліть елемент error масиву методу actions, що повертається, SiteController.php:

class SiteController extends Controller
{
    // ...
    public function actions()
    {
        return [            
            // 'error' => [
            //    'class' => 'yii\web\ErrorAction',
            //    'view' => '@app/views/site/YOUR_ERROR_VIEW.php'
            // ],
            // ...
        ];
    }
    // ...
}

І останнє, вкажіть котролер і дію для обробки помилок у конфігурації додатку yourProject/config/web.php або yourProject/common|backend|frontend/config/main.php:

return [
    // ...
    'components' => [
        // ...
        'errorHandler' => [
            'errorAction' => 'site/myerror',
        ],
        // ...
    ],
    // ...
];

Тепер Yii2 використовуватиме дію site/myerror зазначені в ній loyout і view для виведення помилок.