Yii2. Работа с Error Handler (обработчик ошибок)

Включаем/выключаем сообщения об ошибках

В Yii2 обработчик ошибок по умолчанию включен. Отключить его можно следующим образом, откройте файл @app/web/index.php и добавьте следующий код:

  1. // Yii2 отключить error handler
  2. 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 для вывода ошибок и исключений:

  1. return [
  2. // ...
  3. 'components' => [
  4. // ...
  5. 'errorHandler' => [
  6. 'errorAction' => 'site/error',
  7. ],
  8. // ...
  9. ],
  10. // ...
  11. ];

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

  1. class SiteController extends Controller
  2. {
  3. // ...
  4. public function actions()
  5. {
  6. return [
  7. 'error' => [
  8. 'class' => 'yii\web\ErrorAction',
  9. ],
  10. // ...
  11. ];
  12. }
  13. // ...
  14. }

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

Настройка представления (view) при конфигурации по умолчанию

Предположим, что используется конфигурация по умолчанию. В yourProject/config/web.php или yourProject/frontend|backend/config/main.php:

  1. return [
  2. // ...
  3. 'components' => [
  4. // ...
  5. 'errorHandler' => [
  6. 'errorAction' => 'site/error',
  7. ],
  8. // ...
  9. ],
  10. // ...
  11. ];

В контроллере SiteController приложения yourProject/controllers/SiteController.php:

  1. class SiteController extends Controller
  2. {
  3. // ...
  4. public function actions()
  5. {
  6. return [
  7. 'error' => [
  8. 'class' => 'yii\web\ErrorAction',
  9. ],
  10. // ...
  11. ];
  12. }
  13. // ...
  14. }

Кастомизируем представление (view) вывода ошибок

Использовать свое представление (view) для вывода ошибки очень просто, достаточно добавить путь к view в настройки SiteController метод actions элемент массива error. Он будет перекрывать свойства yii\web\ErrorAction, файл SiteController.php:

  1. class SiteController extends Controller
  2. {
  3. // ...
  4. public function actions()
  5. {
  6. return [
  7. 'error' => [
  8. 'class' => 'yii\web\ErrorAction',
  9. 'view' => '@app/views/site/myerror.php'
  10. ],
  11. // ...
  12. ];
  13. }
  14. // ...
  15. }

Кастомизируем layout вывода ошибок

Для решения этой задачи у нас есть 2 варианта.

1-й вариант

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

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

2-й вариант

Назначить layout для ошибок в методе beforeAction контроллера SiteController, SiteController.php:

  1. public function beforeAction($action)
  2. {
  3. if ($action->id == 'error') {
  4. $this->layout = 'error_layout';
  5. }
  6. return parent::beforeAction($action);
  7. }

Использование кастомизированого действия (action) для вывода ошибок

Так же вы можете написать свой собственный метод действия обработки ошибок и использовать собственное view или layout для отображения информации об ошибке.

Например создайте действие myerror в контроллере SiteController и используйте его как метод обработки ошибок, SiteController.php:

  1. class SiteController extends Controller
  2. {
  3. // ...
  4. public function actionMyerror()
  5. {
  6. $exception = Yii::$app->errorHandler->exception;
  7. if ($exception !== null) {
  8. $statusCode = $exception->statusCode;
  9. $name = $exception->getName();
  10. $message = $exception->getMessage();
  11. $this->layout = 'your_error_layout';
  12. return $this->render('yourErrorView', [
  13. 'exception' => $exception,
  14. 'statusCode' => $statusCode,
  15. 'name' => $name,
  16. 'message' => $message
  17. ]);
  18. }
  19. }
  20. }

Далее закоментируйте или удалите елемент error возвращаемого массива метода actions, SiteController.php:

  1. class SiteController extends Controller
  2. {
  3. // ...
  4. public function actions()
  5. {
  6. return [
  7. // 'error' => [
  8. // 'class' => 'yii\web\ErrorAction',
  9. // 'view' => '@app/views/site/YOUR_ERROR_VIEW.php'
  10. // ],
  11. // ...
  12. ];
  13. }
  14. // ...
  15. }

И последнее, укажите котроллер и действие для обработки ошибок в конфигурации приложения yourProject/config/web.php или yourProject/common|backend|frontend/config/main.php:

  1. return [
  2. // ...
  3. 'components' => [
  4. // ...
  5. 'errorHandler' => [
  6. 'errorAction' => 'site/myerror',
  7. ],
  8. // ...
  9. ],
  10. // ...
  11. ];

Теперь Yii2 будет использовать действие site/myerror указанные в нем loyout и view для вывода ошибок.

Источник: Перейти
Комментарии (0):
Чтобы оставить свой комментарий, необходимо пройти аутентификацию