Yii - Manejo de errores

Yii incluye un controlador de errores incorporado. El controlador de errores de Yii hace lo siguiente:

  • Convierte todos los errores de PHP no fatales en excepciones detectables.
  • Muestra todos los errores y excepciones con una pila de llamadas detallada.
  • Soporta diferentes formatos de error.
  • Admite el uso de una acción del controlador para mostrar errores.

Para deshabilitar el controlador de errores, debe definir la constante YII_ENABLE_ERROR_HANDLER como falsa en el script de entrada. El controlador de errores está registrado como un componente de la aplicación.

Step 1 - Puedes configurarlo de la siguiente manera.

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

La configuración anterior establece el número de líneas de código fuente que se mostrarán en 10. El controlador de errores convierte todos los errores de PHP no fatales en excepciones detectables.

Step 2 - Agregar una nueva función llamada actionShowError() al SiteController.

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

Step 3 - Ir a la URL http://localhost:8080/index.php?r=site/show-error. Verá un mensaje de advertencia.

Si desea mostrarle al usuario que su solicitud no es válida, puede lanzar el yii\web\NotFoundHttpException.

Step 4 - Modificar el actionShowError() función.

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

Step 5 - Escriba la dirección http://localhost:8080/index.php?r=site/show-erroren la barra de direcciones. Verá el siguiente error HTTP.

Cuando la constante YII_DEBUG es verdadera, el controlador de errores mostrará los errores con una pila de llamadas detallada. Cuando la constante es falsa, solo se mostrará el mensaje de error. De forma predeterminada, el controlador de errores muestra errores al usar estas vistas:

  • @yii/views/errorHandler/exception.php - el archivo de visualización se utiliza cuando los errores deben mostrarse con información de la pila de llamadas.

  • @yii/views/errorHandler/error.php - el archivo de visualización se utiliza cuando los errores deben mostrarse sin información de la pila de llamadas.

Puede utilizar acciones de error dedicadas para personalizar la visualización de errores.

Step 6 - Modificar el errorHandler componente de la aplicación en el config/web.php archivo.

<?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;
?>

La configuración anterior define que cuando es necesario mostrar un error sin la pila de llamadas, el site/error se ejecutará la acción.

Step 7 - Modificar el actions() método del SiteController.

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

El código anterior define, que cuando un error ocurre, se renderizará la vista de error.

Step 8 - Crea un archivo llamado error.php en el directorio 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>

Step 9 - Ir a la dirección http://localhost:8080/index.php?r=site/show-error, verá la vista de error personalizada.