11. Gestion des erreurs

Pour le moment, lorsqu'on essaie d'accéder à une ressource qui n'existe pas, on a l'erreur suivante qui s'affiche :


 

Si on essaie d'accéder à une URL inexistante, on a une autre erreur qui s'affiche :

La route /api/phones existe, mais pas /phones/api

On va créer un subscriber pour gérer ces erreurs.

 

Créons notre subscriber

Commençons par créer un ExceptionSubscriber pour gérer nos erreurs. Pour nous aider, lancez la commande : 

./bin/console make:subscriber

Il nous demande sur quel évènement nous allons nous câbler, ici ce sera kernel.exception. Voici le fichier généré :

<?php

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class ExceptionSubscriber implements EventSubscriberInterface
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        // ...
    }

    public static function getSubscribedEvents()
    {
        return [
           'kernel.exception' => 'onKernelException',
        ];
    }
}

On va devoir compléter notre subscriber :

- en récupérant le code de la requête HTTP 

- en renvoyant une réponse au format JSON.

 

Voici notre fichier actualisé : 

<?php

namespace App\EventSubscriber;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;

class ExceptionSubscriber implements EventSubscriberInterface
{
    public function onKernelException(GetResponseForExceptionEvent $event)
    {
        $exception = $event->getException();
        $data = [
            'status' => $exception->getStatusCode(),
            'message' => 'Resource not found'
        ];

        $response = new JsonResponse($data);
        $event->setResponse($response);
    }

    public static function getSubscribedEvents()
    {
        return [
           'kernel.exception' => 'onKernelException',
        ];
    }
}

 

On a seulement récupéré le code HTTP de la requête en fonction de l'exception, créé un tableau $data qui stocke le code récupéré et le message. 

Allez sur Postman et accédez à l'URL http://localhost:8000/api/phones/123


 

Si vous essayez d'accéder à l'URL http://localhost:8000/phones/api (qui n'existe pas, pour rappel) vous devez avoir le résultat suivant :


 

On a maintenant géré nos erreurs avec un simple Subscriber. 

Il est grand temps de nous occuper de l'ajout de nouvelles ressources 😁