Aller au contenu principal

Gestion des erreurs

Comment gérer les erreurs dans une application Symfony en utilisant l'injection de dépendance

Schéma

Petite vérification​

Avant de commencer, vérifiez si vous savez...

  1. citer la commande Composer qui installe DoctrineFixturesBundle, et préciser l'option qui indique qu'il s'agit d'une dépendance de développement
  2. citer le nom de la méthode que doit définir toute classe de fixtures, et la classe dont elle doit hériter
  3. expliquer ce qui se passe dans la base de données lorsqu'on exécute php bin/console doctrine:fixtures:load sans l'option --append
📌 Réponse attendue

Notions théoriques​

La gestion des erreurs est une partie essentielle de tout développement d'application.

Symfony fournit plusieurs outils pour aider à gérer les erreurs :

  • des exceptions,
  • des logs
  • et des environnements de développement et de production distincts.

Symfony transforme toutes les erreurs PHP en exceptions, ce qui signifie que vous pouvez utiliser des blocs try/catch pour gérer les erreurs.

Symfony fournit également plusieurs classes d'exceptions spécifiques que vous pouvez utiliser pour gérer les erreurs de différentes manières.

Exemple de mise en application​

Supposons que nous voulons vérifier si un joueur existe avant de créer un personnage pour lui.

Nous pouvons le faire en injectant le repository de Player dans notre contrôleur.

Si aucun joueur n'est trouvé, nous pouvons lancer une NotFoundHttpException :

use App\Entity\Player;
use App\Repository\PlayerRepository;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;

class GameController extends AbstractController
{
public function __construct(
private PlayerRepository $playerRepository
) {}

#[Route('/game/create-character/{playerId}', name: 'create_character')]
public function createCharacter(int $playerId): Response
{
$player = $this->playerRepository->find($playerId);

if ($player === null) {
throw $this->createNotFoundException('No player found with id ' . $playerId);
}

// ...

return new Response('Character created!');
}
}

Test de mémorisation/compréhension​


Comment injecte-t-on un repository dans un contrôleur Symfony ?


Quelle méthode utilise-t-on pour lancer une exception 404 dans Symfony ?


Comment vérifie-t-on si un utilisateur est autorisé à effectuer une action dans Symfony ?



TP pour réfléchir et résoudre des problèmes​

Votre défi pour aujourd'hui consiste à modifier votre action de création de personnage pour gérer les erreurs qui peuvent survenir lors de la création d'un personnage.

Vous devriez vérifier si le joueur existe et si l'utilisateur est autorisé à créer un personnage pour ce joueur. Utilisez l'injection de dépendance pour tous les services nécessaires.

Vérification 1 : Vérifier que le joueur existe avant de créer un personnage.

Vérification 2 : Vérifier que l'utilisateur est autorisé à créer un personnage pour ce joueur.


Bonne pratique - Anticiper les cas d'erreur avec des exceptions explicites

Provoquer volontairement des erreurs est une bonne manière de comprendre les mécanismes de protection du code. Un développeur qui ne sait pas ce que provoque une erreur ne peut pas anticiper les comportements inattendus de son programme. createNotFoundException() retourne une page 404 propre en production et une erreur détaillée en développement — c'est exactement ce qu'on veut dans les deux cas.

📌 Une solution