src/Listener/ExceptionListener.php line 36

Open in your IDE?
  1. <?php
  2. namespace App\Listener;
  3. use Doctrine\DBAL\Exception\InvalidFieldNameException;
  4. use Psr\Log\LoggerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\JsonResponse;
  7. use Symfony\Component\HttpFoundation\RedirectResponse;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  10. use Symfony\Component\HttpKernel\KernelEvents;
  11. use Symfony\Component\HttpKernel\KernelInterface;
  12. use Symfony\Component\Routing\RouterInterface;
  13. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  14. class ExceptionListener implements EventSubscriberInterface
  15. {
  16.     private RouterInterface $router;
  17.     private string          $environment;
  18.     private LoggerInterface $logger;
  19.     public function __constructKernelInterface $kernelRouterInterface $routerLoggerInterface $logger )
  20.     {
  21.         $this->environment $kernel->getEnvironment();
  22.         $this->router      $router;
  23.         $this->logger      $logger;
  24.     }
  25.     public static function getSubscribedEvents(): array
  26.     {
  27.         return [KernelEvents::EXCEPTION => 'onKernelException'];
  28.     }
  29.     public function onKernelExceptionExceptionEvent $event )
  30.     {
  31.         $request $event->getRequest();
  32.         $route $request->get('_route');
  33.         $exception $event->getThrowable();
  34.         $uri $request->getRequestUri();
  35.         if(substr($uri07) === "/wm-api" || substr($uri04) === "/api")
  36.         {
  37.             $this->logger->critical('Erreur 500 -> '.$exception->getFile().' '.$exception->getLine().' : '.$exception->getMessage());
  38.             $message $this->environment === 'dev' $exception->getMessage() : "An error occured";
  39.             $code 500;
  40.             if(!$route)
  41.             {
  42.                 $code 404;
  43.                 $message "API not found : ".$exception->getMessage();
  44.             }
  45.             elseif($exception instanceof AccessDeniedException)
  46.             {
  47.                 $code 403;
  48.                 $message 'Forbidden';
  49.             }
  50.             elseif($exception instanceof AccessDeniedHttpException)
  51.             {
  52.                 $code 403;
  53.                 $message $exception->getMessage();
  54.             }
  55.             $response = new JsonResponse(['message' => $message'code' => $code], $code);
  56.             $event->setResponse($response);
  57.         }
  58.         if ( $this->environment !== 'dev' ) return;
  59.         if ( $exception instanceof InvalidFieldNameException )
  60.         {
  61.             // Génère la route dev_update_bdd
  62.             $route $this->router->generate'dev_update_bdd' );
  63.             // Redirige vers la route dev_update_bdd
  64.             $response = new RedirectResponse$route );
  65.             $event->setResponse$response );
  66.         }
  67.     }
  68. }