La passion du libre

Le guide complet de Yii 2 (traduction du guide officiel)

Cliquez sur le bouton pour afficher les conseils de lecture.Cliquez à nouveau pour les masquer

Fenêtres surgissantes explicatives

Certains mots dans le texte, affichés en vert et en gras, sont précédés d'une étoile verte sur fond orange. Par exemple, ce mot : lien.

Si vous placez le pointeur de la souris sur un tel mot, une fenêtre surgissante – popup – s'ouvre alors que l'affichage du reste du documment s'atténue. Cette fenêtre contient une explication détaillée du mot en question

Une fois que vous avez pris connaissance de ce que vous affiche cette fenêtre surgissante, vous pouvez retourner à l'état normal en cliquant ailleurs dans le document.

Navigation

Pour naviguer, utilisez le menu vertical à gauche du texte. Les entrées de menu marquées d'une petite flèche vers le bas ouvrent un sous-menu lorsqu'on clique dessus.

Vous pouvez également choisir une lecture continue en cliquant sur un des liens proposés en bas de page.

Gestion des erreurs

Yii inclut un [[yii\web\ErrorHandler|gestionnaire d'erreur]] pré-construit qui rend la gestion des erreurs bien plus agréable qu'auparavant. En particulier, le gestionnaire d'erreurs de Yii possède les fonctionnalités suivantes pour améliorer la gestion des erreurs.

  • Toutes les erreurs PHP non fatales (p. ex. avertissements, notifications) sont converties en exceptions susceptibles d'être interceptées.
  • Les exceptions et les erreurs fatales sont affichées avec les informations détaillées de la pile des appels et les lignes de code source en mode debug.
  • Prise en charge de l'utilisation d'une action de contrôleur dédiée à l'affichage des erreurs.
  • Prise en charge de différents formats de réponse d'erreur.

Le [[yii\web\ErrorHandler|gestionnaire d'erreur]] est activé par défaut. Vous pouvez le désactiver en définissant la constante YII_ENABLE_ERROR_HANDLER à false (faux) dans le script d'entrée de votre application.

Utilisation du gestionnaire d'erreurs

Le [[yii\web\ErrorHandler|gestionnaire d'erreurs]] est enregistré en tant que composant d'application nommé errorHandler. Vous pouvez le configurer dans la configuration de l'application comme indiqué ci-dessous :

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

Avec la configuration qui précède, le nombre de lignes de code source à afficher dans les pages d'exception est limité à 20.

Comme cela a déjà été dit, le gestionnaire d'erreur transforme toutes les erreurs PHP non fatales en exception susceptibles d'être interceptées. Cela signifie que vous pouvez utiliser le code suivant pour vous servir de cette gestion d'erreurs :

use Yii;
use yii\base\ErrorException;

try {
    10/0;
} catch (ErrorException $e) {
    Yii::warning("Division by zero.");
}

// l'exécution continue...

Si vous désirez afficher une page d'erreur disant à l'utilisateur que sa requête est invalide ou inattendue, vous pouvez simplement lever une [[yii\web\HttpException|exception HTTP]], comme l'exception [[yii\web\NotFoundHttpException]]. Le gestionnaire d'erreurs définit alors correctement le code d'état HTTP de la réponse et utilise une vue d'erreur appropriée pour afficher le message d'erreur.

use yii\web\NotFoundHttpException;

throw new NotFoundHttpException();

Personnalisation de l'affichage des erreurs

Le [[yii\web\ErrorHandler|gestionnaire d'erreurs]] ajuste l'affichage de l'erreur en tenant compte de la valeur de la constante YII_DEBUG. Quand YII_DEBUG est égale à true (vrai) (ce qui signifie que le mode debug est activé), le gestionnaire d'erreurs affiche les exceptions avec le détail de la pile des appels et les lignes de code apportant de l'aide au débogage. Quand YII_DEBUG est égale à false (faux), seule le message d'erreur est affiché pour ne pas révéler des informations sensibles sur l'application.

Info: si une exception est un descendant de la classe [[yii\base\UserException]], aucune pile des appels n'est affichée, et ceci indépendamment de la valeur YII_DEBUG. Cela tient au fait que de telles exceptions résultent d'erreurs commises par l'utilisateur et que les développeurs n'ont rien à corriger.

Par défaut, le [[yii\web\ErrorHandler|gestionnaire d'erreurs]] affiche les erreurs en utilisant deux vues:

  • @yii/views/errorHandler/error.php: utilisée lorsque les erreurs doivent être affichées SANS les informations sur la pile des appels. Quand YII_DEBUG est égale à false, c'est la seule vue d'erreur à afficher.
  • @yii/views/errorHandler/exception.php: utilisée lorsque les erreurs doivent être affichées AVEC les informations sur la pile des appels.

Vous pouvez configurer les propriétés [[yii\web\ErrorHandler::errorView|errorView]] et [[yii\web\ErrorHandler::exceptionView|exceptionView]] du gestionnaire d'erreur pour utiliser vos propres vues afin de personnaliser l'affichage des erreurs.

Utilisation des actions d'erreurs

Une meilleure manière de personnaliser l'affichage des erreurs est d'utiliser des actions d'erreur dédiées. Pour cela, commencez par configurer la propriété [[yii\web\ErrorHandler::errorAction|errorAction]] du composant errorHandler comme indiqué ci-après :

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

La propriété [[yii\web\ErrorHandler::errorAction|errorAction]] accepte une route vers une action. La configuration ci-dessus établit que lorsqu'une erreur doit être affichée sans information de la pile des appels, l'action site/error doit être exécutée.

Vous pouvez créer une action site/error comme ceci :

namespace app\controllers;

use Yii;
use yii\web\Controller;

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

Le code ci-dessus définit l'action error en utilisant la classe [[yii\web\ErrorAction]] qui rend une erreur en utilisant une vue nommée error.

En plus d'utiliser [[yii\web\ErrorAction]], vous pouvez aussi définir l'action error en utilisant une méthode d'action similaire à la suivante :

public function actionError()
{
    $exception = Yii::$app->errorHandler->exception;
    if ($exception !== null) {
        return $this->render('error', ['exception' => $exception]);
    }
}

Vous devez maintenant créer un fichier de vue views/site/error.php. Dans ce fichier de vue, vous pouvez accéder aux variables suivantes si l'action d'erreur est définie en tant que [[yii\web\ErrorAction]]:

  • name: le nom de l'erreur ;
  • message: le message d'erreur ;
  • exception: l'objet exception via lequel vous pouvez retrouver encore plus d'informations utiles telles que le code d'état HTTP, le code d'erreur, la pile des appels de l'erreur, etc.

Info: si vous êtes en train d'utiliser le modèle de projet basic ou le modèle de projet avancé, l'action d'erreur est la vue d'erreur sont déjà définies pour vous.

Note: si vous avez besoin de rediriger dans un gestionnaire d'erreur, faites-le de la manière suivante :

Yii::$app->getResponse()->redirect($url)->send();
return;

Personnalisation du format de la réponse d'erreur

Le gestionnaire d'erreurs affiche les erreurs en respectant le réglage de format de la réponse. Si le [[yii\web\Response::format|format de la réponse]] est html, il utilise la vue d'erreur ou d'exception pour afficher les erreurs, comme c'est expliqué dans la sous-section précédente. Pour les autres formats de réponse, le gestionnaire d'erreurs assigne la représentation de l'erreur sous forme de tableau à la propriété [[yii\web\Response::data]] qui est ensuite convertie dans le format désiré. Par exemple, si le format de la réponse est json, vous pourriez voir une réponse similaire à la suivante :

HTTP/1.1 404 Not Found
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

{
    "name": "Not Found Exception",
    "message": "The requested resource was not found.",
    "code": 0,
    "status": 404
}

Vous pouvez personnaliser le format de réponse d'erreur en répondant à l'événement beforeSend du composant response dans la configuration de l'application :

return [
    // ...
    'components' => [
        'response' => [
            'class' => 'yii\web\Response',
            'on beforeSend' => function ($event) {
                $response = $event->sender;
                if ($response->data !== null) {
                    $response->data = [
                        'success' => $response->isSuccessful,
                        'data' => $response->data,
                    ];
                    $response->statusCode = 200;
                }
            },
        ],
    ],
];

Le code précédent formate la réponse d'erreur comme suit :

HTTP/1.1 200 OK
Date: Sun, 02 Mar 2014 05:31:43 GMT
Server: Apache/2.2.26 (Unix) DAV/2 PHP/5.4.20 mod_ssl/2.2.26 OpenSSL/0.9.8y
Transfer-Encoding: chunked
Content-Type: application/json; charset=UTF-8

{
    "success": false,
    "data": {
        "name": "Not Found Exception",
        "message": "The requested resource was not found.",
        "code": 0,
        "status": 404
    }
}