src/Event/ExceptionListener.php line 24

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use App\Entity\ErrorLog;
  4. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  5. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  6. use Doctrine\ORM\EntityManagerInterface;
  7. use Symfony\Component\HttpKernel\Profiler\Profiler;
  8. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  9. class ExceptionListener
  10. {
  11.     private $entityManager;
  12.     private $tokenStorage;
  13.     public function __construct(EntityManagerInterface $entityManagerTokenStorageInterface $tokenStorageProfiler $profiler)
  14.     {
  15.         $this->entityManager $entityManager;
  16.         $this->tokenStorage $tokenStorage;
  17.         $this->profiler $profiler;
  18.     }
  19.     public function onKernelException(ExceptionEvent $event)
  20.     {
  21.         // Récupérer l'exception
  22.         $exception $event->getThrowable();
  23. //        dump($this->profiler->get('security'));exit;
  24.         // Vérifie s'il s'agit d'une exception HTTP
  25. // Initialiser le code d'état
  26.         $statusCode 500// Par défaut pour les erreurs non gérées
  27.         // Vérifie s'il s'agit d'une exception HTTP (comme 404)
  28.         if ($exception instanceof HttpExceptionInterface) {
  29.             $statusCode $exception->getStatusCode();
  30.         }
  31.         // Filtre pour capturer les erreurs 404 et 500
  32.         if ($statusCode === 404 || $statusCode === 500) {
  33.             // Récupérer l'utilisateur courant, s'il est connecté
  34.             $token $this->tokenStorage->getToken();
  35.             $user $token $token->getUser() : null;
  36.             $username $user $user->getUsername() : 'Anonymous';
  37.             $userId $user  $user->getId() : 0;
  38.             // Récupérer l'URL de la requête
  39.             $url $event->getRequest()->getUri();
  40.             // Vérifier si l'erreur existe déjà dans la base pour cette URL et ce code de statut
  41.             $existingError $this->entityManager->getRepository(ErrorLog::class)
  42.                 ->findOneBy([
  43.                     'url' => $url,
  44.                     'message' => $exception->getMessage(),
  45.                     'userid' => $userId,
  46.                     'typeerror' => $statusCode
  47.                 ]);
  48.             if ($existingError) {
  49.                 // Si l'erreur existe déjà, ne rien faire
  50.                 return;
  51.             }
  52.             // Créer une nouvelle entrée d'erreur pour la base de données
  53.             $error = new ErrorLog();
  54.             $error->setMessage($exception->getMessage());
  55.             $error->setDatelog(new \DateTime());
  56.             $error->setUserid($userId);
  57.             $error->setUsername($username);
  58.             $error->setUrl($url);
  59.             $error->setTypeerror($statusCode);
  60.             // Sauvegarder l'erreur dans la base de données
  61.             $this->entityManager->persist($error);
  62.             $this->entityManager->flush();
  63.         }
  64.     }
  65. }