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 __construct( KernelInterface $kernel, RouterInterface $router, LoggerInterface $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 onKernelException( ExceptionEvent $event )
  30. {
  31. $request = $event->getRequest();
  32. $route = $request->get('_route');
  33. $exception = $event->getThrowable();
  34. $uri = $request->getRequestUri();
  35. if(substr($uri, 0, 7) === "/wm-api" || substr($uri, 0, 4) === "/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. }