Включаем/выключаем сообщения об ошибках
В 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 для вывода ошибок.