src/Hitso/Bundle/CommonBundle/EventListener/ExceptionSubscriber.php line 83

Open in your IDE?
  1. <?php
  2. namespace Hitso\Bundle\CommonBundle\EventListener;
  3. use Doctrine\Common\Collections\Criteria;
  4. use Hitso\Bundle\CommonBundle\Helper\Templating\TemplatingHelperInterface;
  5. use Hitso\Bundle\RoutingBundle\Entity\Redirect;
  6. use Hitso\Bundle\RoutingBundle\Manager\RedirectManager;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Request;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
  12. use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
  13. use Symfony\Component\HttpKernel\KernelEvents;
  14. use Symfony\Component\HttpKernel\KernelInterface;
  15. use Symfony\Component\Routing\Exception\ResourceNotFoundException;
  16. use Symfony\Contracts\Translation\TranslatorInterface;
  17. /**
  18.  * Class ExceptionSubscriber
  19.  *
  20.  * @package Hitso\Bundle\CommonBundle\EventListener
  21.  */
  22. class ExceptionSubscriber implements EventSubscriberInterface
  23. {
  24.     /**
  25.      * @var KernelInterface
  26.      */
  27.     protected $kernel;
  28.     /**
  29.      * @var RedirectManager
  30.      */
  31.     private $redirectManager;
  32.     /**
  33.      * @var TemplatingHelperInterface
  34.      */
  35.     protected $templatingHelper;
  36.     /**
  37.      * @var TranslatorInterface
  38.      */
  39.     protected $translator;
  40.     /**
  41.      * ExceptionSubscriber constructor.
  42.      *
  43.      * @param KernelInterface           $kernel
  44.      * @param TemplatingHelperInterface $templatingHelper
  45.      */
  46.     public function __construct(
  47.         KernelInterface $kernel,
  48.         RedirectManager $redirectManager,
  49.         TemplatingHelperInterface $templatingHelper,
  50.         TranslatorInterface $translator
  51.     ) {
  52.         $this->kernel           $kernel;
  53.         $this->redirectManager  $redirectManager;
  54.         $this->templatingHelper $templatingHelper;
  55.         $this->translator       $translator;
  56.     }
  57.     public static function getSubscribedEvents()
  58.     {
  59.         return [
  60.             KernelEvents::EXCEPTION => ['onKernelException'0],
  61.         ];
  62.     }
  63.     public function onKernelException(GetResponseForExceptionEvent $event)
  64.     {
  65.         $exception $event->getException();
  66.         $request   $event->getRequest();
  67.         if ($exception instanceof HttpExceptionInterface || $exception instanceof ResourceNotFoundException) {
  68.             $redirect $this->getRedirect($request);
  69.             if ($redirect instanceof Redirect) {
  70.                 $response = new RedirectResponse($redirect->getTarget(), $redirect->getStatus());
  71.             } else {
  72.                 $response $this->getNotFoundResponse($request$exception);
  73.             }
  74.             $event->setResponse($response);
  75.         }
  76.         if ($exception->getCode() == 500) {
  77.             $response $this->getErrorResponse($exception);
  78.             $event->setResponse($response);
  79.         }
  80.     }
  81.     private function getNotFoundResponse(Request  $request$exception): Response
  82.     {
  83.         $this->translator->setLocale($request->getLocale());
  84.         $content $this->templatingHelper->render('HitsoCommonBundle:Front/Exception:404.html.twig', [
  85.             'message'   => $exception->getMessage(),
  86.             'code'      => $exception->getStatusCode(),
  87.             'exception' => $exception,
  88.         ]);
  89.         $response = new Response();
  90.         $response->setContent($content);
  91.         if ($exception instanceof HttpExceptionInterface) {
  92.             $response->setStatusCode($exception->getStatusCode());
  93.             $response->headers->replace($exception->getHeaders());
  94.         } else {
  95.             $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
  96.         }
  97.         return $response;
  98.     }
  99.     private function getErrorResponse($exception): Response
  100.     {
  101.         $content $this->templatingHelper->render('HitsoCommonBundle:Front/Exception:500.html.twig', [
  102.             'message'   => $exception->getMessage(),
  103.             'code'      => $exception->getCode(),
  104.             'exception' => $exception,
  105.         ]);
  106.         $response = new Response();
  107.         $response->setContent($content);
  108.         if ($exception instanceof HttpExceptionInterface) {
  109.             $response->setStatusCode($exception->getCode());
  110.             $response->headers->replace($exception->getHeaders());
  111.         } else {
  112.             $response->setStatusCode(Response::HTTP_INTERNAL_SERVER_ERROR);
  113.         }
  114.         return $response;
  115.     }
  116.     private function getRedirect(Request $request): ?Redirect
  117.     {
  118.         $path     $request->getPathInfo();
  119.         $criteria = new Criteria();
  120.         $criteria->andWhere($criteria->expr()->eq('source'$path));
  121.         $collection $this->redirectManager->getCollection($criteria);
  122.         if ($collection->count()) {
  123.             return $collection->first();
  124.         }
  125.         return null;
  126.     }
  127. }