src/EventListener/ExceptionListener.php line 33

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Security\AccessDeniedException;
  4. use Doctrine\DBAL\Exception\DeadlockException;
  5. use FOS\RestBundle\View\View;
  6. use FOS\RestBundle\View\ViewHandler;
  7. use Psr\Log\LoggerInterface;
  8. use Symfony\Component\HttpFoundation\Response;
  9. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  10. use Twig\Environment;
  11. /**
  12.  * Class ExceptionListener
  13.  * @package App\EventListener
  14.  * @since 0.18.6
  15.  */
  16. class ExceptionListener {
  17.     private ViewHandler $viewHandler;
  18.     private Environment $twig;
  19.     private LoggerInterface $logger;
  20.     public function __construct(ViewHandler $viewHandlerEnvironment $twigLoggerInterface $logger) {
  21.         $this->viewHandler $viewHandler;
  22.         $this->twig $twig;
  23.         $this->logger $logger;
  24.     }
  25.     public function onKernelException(ExceptionEvent $event) {
  26.         $exception $event->getThrowable();
  27.         if ($exception instanceof AccessDeniedException) {
  28.             if ($event->getRequest()->getRequestFormat() === 'html') {
  29.                 try {
  30.                     $event->setResponse(
  31.                         new Response(
  32.                             $this->twig->render(
  33.                                 'error/access_denied.html.twig',
  34.                                 ['messages' => $exception->getMessages()]
  35.                             ),
  36.                             $exception->getCode()
  37.                         )
  38.                     );
  39.                     return;
  40.                 } catch (\Exception $e) {
  41.                     $this->logger->error('Can not render access denied template', ['exception' => $e]);
  42.                 }
  43.             }
  44.             $data = [
  45.                 'message' => implode('. 'is_array($exception->getMessages()) ? $exception->getMessages() : [$exception->getMessages()]),
  46.             ];
  47.             $event->setResponse($this->viewHandler->handle(View::create($data$exception->getCode() ?: 400)));
  48.         }
  49.         if ($exception instanceof DeadlockException) {
  50.             $this->logger->error('Got deadlock exception', ['exception' => $exception]);
  51.             $event->setResponse(new Response('Resource locked. Retry request'503));
  52.         }
  53.     }
  54. }