Laravel 4 : chapitre 11 : Gestion des erreurs

Un code sans erreur c’est rare, des requêtes parfaites encore plus. Laravel affiche une page détaillée des erreurs rencontrées. Voilà par exemple ce qu’on obtient pour une page qui n’existe pas :

img13C’est évidemment bien pratique en phase de développement mais fortement déconseillé sur un site en production. Pourquoi ? déjà ce n’est pas très esthétique pour l’utilisateur et en plus ça peut guider une personne mal intentionnée pour pirater votre site. Regardez ce code dans le fichier app/config/app.php :

'debug' => true,

Changez « true » pour « false », maintenant pour une page non trouvée on obtient seulement :

img35

C’est plus concis et largement suffisant pour l’utilisateur (bon s’il est anglophone dans ce cas Tongue Out mais nous avons déjà vu comment arranger ça précédemment). Donc pensez bien à enlever ce mode « debug » lorsque votre site est en production ! Maintenant ouvrez le fichier app/start/global.php. Vous trouvez ce code :

App::error(function(Exception $exception, $code)
{
    Log::error($exception);
});

Je rappelle que ce fichier est lu pour chaque requête reçue lorsque vous êtes dans un environnement « global » qui est l’environnement par défaut. Nous reparlerons de cela plus tard pour nous concentrer sur les erreurs. Nous avons celles qui sont propres à PHP et celles qui sont générées par les différents composants utilisés, comme le NotFoundHttpException que nous rencontrons pour une page qui n’existe pas. Le code présent dans le fichier app/start/global.php intercepte toutes les erreurs rencontrées et affiche une information sur cette erreur. C’est a priori largement suffisant mais on peut aussi trier les erreurs par catégories et les intercepter. Prenons un exemple, entrez cette route avec une belle erreur PHP :

Route::get('/', function()
{
    return substr(548, 5, 4);
});

Maintenant ajoutez ce code dans le fichier app/start/global.php :

App::error(function(UnexpectedValueException $exception)
{
    return 'Une valeur inattendue est présente !';
});

Maintenant si vous utilisez l’URL http://localhost/laravel/public vous obtenez :

Une valeur inattendue est présente !

Vous avez donc le loisir de gérer les erreurs comme vous le voulez.

Le fichier de « log »

Par défaut Laravel génère un fichier de « log » journalier dans le dossier app/storage/logs. Le nom des fichiers est de la forme log-année-mois-jour.txt, par exemple log-2013-01-22.txt. Que contient ce fichier ? Tout ce qu’on lui dit de mémoriser. Nous avons vu ci-dessus dans l’interception des erreurs la ligne :

Log::error($exception);

Par défaut on mémorise donc toutes les erreurs rencontrées. Laravel utilise Monolog. On peut générer des enregistrements personnalisés, prenons le cas ci-dessus en changeant le code :

App::error(function(UnexpectedValueException $exception)
{
    Log::error('Je me suis encore trompé avec mes valeurs...');
});

Si vous utilisez l’URL http://localhost/laravel/public vous obtenez maintenant le message d’erreur classique avec tous les détails. Pour voir si notre inscription a agi il faut ouvrir le fichier de log. Je trouve cette ligne :

[2013-01-22 12:52:16] log.ERROR: Je me suis encore trompé avec mes valeurs…

Je trouve aussi l’inscription de base :

[2013-01-22 12:52:16] log.ERROR: exception ‘UnexpectedValueException’ with message ‘The Response content must be a string or object implementing __toString(), « boolean » given.’ in…

Monolog respecte la norme PSR-3 qui définit l’interface de log. En particulier sont définis 8 niveaux : debug, info, notice, warning, error, critical, alert, emergency. Si vous voulez utiliser des fonctionnalités de Monolog vous pouvez récupérer facilement une référence. par exemple le code suivant est l’équivalent du précédent :

App::error(function(UnexpectedValueException $exception)
{
    $log = Log::getMonolog();
    $log->addError('Je me suis encore trompé avec mes valeurs...');
});

Les erreurs HTTP

Les erreurs HTTP peuvent être une page inconnue (404), une accès non autorisé (401),  une syntaxe erronée (400)… Il est possible de générer une de ces erreurs avec cette syntaxe :

Route::get('/', function()
{
    App::abort(400, 'Syntaxe erronée !');
});

Maintenant si vous utilisez l’URL http://localhost/laravel/public vous obtenez :

img14

Je rappelle aussi comment on intercepte une erreur 404 :

App::missing(function($exception)
{
    return 'Cette page n\'existe pas !';
});

6 réflexions sur “Laravel 4 : chapitre 11 : Gestion des erreurs

  1. christoff dit :

    Bonjour à tous,

    Comment doit-on faire pour pouvoir afficher une page personnalisée en cas d’erreur ?
    J’ai ajouté le code suivant dans mon fichier app/start/global.php.
    Ai-je bien fait ?


    App::error(function(Exception $exception, $code)
    {
    Log::error($exception);
    return View::make('pag-ctn-erreur')
    ->with('code_erreur',$code);
    });

  2. Twinspirit dit :

    Bonjour,

    Je n’arrive pas à retrouver la console de debug qui est présente dans laravel3.
    C’est un outils de choix pour débuger les requêtes SQL, par exemple.

    Est-elle toujours présente dans laravel 4 ? Si oui, comment la mettre en place ?

  3. Nic'O dit :

    Merci bien pour cette présentation de Laravel 4.

    Je ne serai pas contre un tuto sur la mise en places des fameux tests unitaires, j’ai jamais compris comment cela s’implémentait (même avec la doc de Laravel).

    Bonne continuation.

Laisser un commentaire