Учебники

Yii — Обработка ошибок

Yii включает встроенный обработчик ошибок. Обработчик ошибок Yii делает следующее:

  • Преобразует все нефатальные ошибки PHP в поддающиеся отлову исключения.
  • Отображает все ошибки и исключения с подробным стеком вызовов.
  • Поддерживает различные форматы ошибок.
  • Поддерживает использование действия контроллера для отображения ошибок.

Чтобы отключить обработчик ошибок, вы должны определить константу YII_ENABLE_ERROR_HANDLER как ложную в сценарии ввода. Обработчик ошибок зарегистрирован как компонент приложения.

Шаг 1 — Вы можете настроить его следующим образом.

return [
   'components' => [
      'errorHandler' => [
         'maxSourceLines' => 10,
      ],
   ],
];

Приведенная выше конфигурация устанавливает количество отображаемых строк исходного кода равным 10. Обработчик ошибок преобразует все нефатальные ошибки PHP в перехватываемые исключения.

Шаг 2 — Добавьте новую функцию actionShowError () в SiteController.

public function actionShowError() {
   try {
      5/0;
   } catch (ErrorException $e) {
      Yii::warning("Ooops...division by zero.");
   }
   // execution continues...
}

Шаг 3 — Перейдите по URL-адресу http: // localhost: 8080 / index.php? R = site / show-error . Вы увидите предупреждение.

Добавить метод actionShowError

Если вы хотите показать пользователю, что его запрос недействителен, вы можете вызвать исключение yii \ web \ NotFoundHttpException .

Шаг 4 — Измените функцию actionShowError () .

public function actionShowError() {
   throw new NotFoundHttpException("Something unexpected happened");
}

Шаг 5 — Введите адрес http: // localhost: 8080 / index.php? R = site / show-error в адресной строке. Вы увидите следующую ошибку HTTP.

Изменить метод actionShowError

Когда константа YII_DEBUG имеет значение true, обработчик ошибок будет отображать ошибки с подробным стеком вызовов. Когда константа имеет значение false, будет отображаться только сообщение об ошибке. По умолчанию обработчик ошибок показывает ошибки, используя эти представления —

  • @ yii / views / errorHandler / exception.php — файл представления используется, когда ошибки должны отображаться с информацией стека вызовов.

  • @ yii / views / errorHandler / error.php — файл представления используется, когда ошибки должны отображаться без информации стека вызовов.

@ yii / views / errorHandler / exception.php — файл представления используется, когда ошибки должны отображаться с информацией стека вызовов.

@ yii / views / errorHandler / error.php — файл представления используется, когда ошибки должны отображаться без информации стека вызовов.

Вы можете использовать специальные действия по ошибке, чтобы настроить отображение ошибок.

Шаг 6 — Измените компонент приложения errorHandler в файле config / web.php .

<?php
   $params = require(__DIR__ . '/params.php');
   $config = [
      'id' => 'basic',
      'basePath' => dirname(__DIR__),
      'bootstrap' => ['log'],
      'components' => [
         'request' => [
            // !!! insert a secret key in the following (if it is empty) - this
               //is required by cookie validation
            'cookieValidationKey' => 'ymoaYrebZHa8gURuolioHGlK8fLXCKjO',
         ],
         'cache' => [
            'class' => 'yii\caching\FileCache',
         ],
         'user' => [
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
         ],
         'errorHandler' => [
            'errorAction' => 'site/error',
         ],
         //other components...
            'db' => require(__DIR__ . '/db.php'),
      ],
      'modules' => [
         'hello' => [
            'class' => 'app\modules\hello\Hello',
         ],
      ],
      'params' => $params,
   ];
   if (YII_ENV_DEV) {
      // configuration adjustments for 'dev' environment
      $config['bootstrap'][] = 'debug';
      $config['modules']['debug'] = [
         'class' => 'yii\debug\Module',
      ];
      $config['bootstrap'][] = 'gii';
      $config['modules']['gii'] = [
         'class' => 'yii\gii\Module',
      ];
   }
   return $config;
?>

Приведенная выше конфигурация определяет, что когда ошибка должна отображаться без стека вызовов, будет выполнено действие site / error .

Шаг 7 — Измените метод actions () в SiteController.

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

Приведенный выше код определяет, что при возникновении ошибки будет отображено представление об ошибке.

Шаг 8 — Создайте файл с именем error.php в каталоге views / site.

<?php
   /* @var $this yii\web\View */
   /* @var $name string */
   /* @var $message string */
   /* @var $exception Exception */
   use yii\helpers\Html;
   $this->title = $name;
?>

<div class = "site-error">
   <h2>customized error</h2>
   <h1><?= Html::encode($this->title) ?></h1>
   
   <div class = "alert alert-danger">
      <?= nl2br(Html::encode($message)) ?>
   </div>
   
   <p>
      The above error occurred while the Web server was processing your request.
   </p>
   
   <p>
      Please contact us if you think this is a server error. Thank you.
   </p>
</div>

Шаг 9 — Перейдите по адресу http: // localhost: 8080 / index.php? R = site / show-error , вы увидите настроенный вид ошибки.