<?php
namespace App\Listener;
use Doctrine\DBAL\Exception\InvalidFieldNameException;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
class ExceptionListener implements EventSubscriberInterface
{
private RouterInterface $router;
private string $environment;
private LoggerInterface $logger;
public function __construct( KernelInterface $kernel, RouterInterface $router, LoggerInterface $logger )
{
$this->environment = $kernel->getEnvironment();
$this->router = $router;
$this->logger = $logger;
}
public static function getSubscribedEvents(): array
{
return [KernelEvents::EXCEPTION => 'onKernelException'];
}
public function onKernelException( ExceptionEvent $event )
{
$request = $event->getRequest();
$route = $request->get('_route');
$exception = $event->getThrowable();
$uri = $request->getRequestUri();
if(substr($uri, 0, 7) === "/wm-api" || substr($uri, 0, 4) === "/api")
{
$this->logger->critical('Erreur 500 -> '.$exception->getFile().' '.$exception->getLine().' : '.$exception->getMessage());
$message = $this->environment === 'dev' ? $exception->getMessage() : "An error occured";
$code = 500;
if(!$route)
{
$code = 404;
$message = "API not found : ".$exception->getMessage();
}
elseif($exception instanceof AccessDeniedException)
{
$code = 403;
$message = 'Forbidden';
}
elseif($exception instanceof AccessDeniedHttpException)
{
$code = 403;
$message = $exception->getMessage();
}
$response = new JsonResponse(['message' => $message, 'code' => $code], $code);
$event->setResponse($response);
}
if ( $this->environment !== 'dev' ) return;
if ( $exception instanceof InvalidFieldNameException )
{
// Génère la route dev_update_bdd
$route = $this->router->generate( 'dev_update_bdd' );
// Redirige vers la route dev_update_bdd
$response = new RedirectResponse( $route );
$event->setResponse( $response );
}
}
}