vendor/simpledot/cms-bundle/AWCmsBundle/EventListener/ExceptionListener.php line 79

Open in your IDE?
  1. <?php
  2. namespace AWCmsBundle\EventListener;
  3. use AWCmsBundle\Exception\AuthFailException;
  4. use AWCmsBundle\Manager\RedirectionManager;
  5. use AWCmsBundle\Manager\SiteManager;
  6. use AWCmsBundle\Manager\SlugManager;
  7. use AWCmsBundle\Service\SiteByHostNameProvider;
  8. use AWCmsBundle\Service\SiteProvider;
  9. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  10. use Symfony\Component\HttpFoundation\JsonResponse;
  11. use Symfony\Component\HttpFoundation\RedirectResponse;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Symfony\Component\HttpFoundation\Response;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  16. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. use Symfony\Component\Routing\RouterInterface;
  19. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  20. use Symfony\Contracts\Translation\TranslatorInterface;
  21. class ExceptionListener implements EventSubscriberInterface
  22. {
  23.     /**
  24.      * @var RedirectionManager
  25.      */
  26.     private RedirectionManager $redirectionManager;
  27.     /**
  28.      * @var SiteManager
  29.      */
  30.     private SiteManager $siteManager;
  31.     /**
  32.      * @var SlugManager
  33.      */
  34.     private SlugManager $slugManager;
  35.     /**
  36.      * @var SessionInterface
  37.      */
  38.     private SessionInterface $session;
  39.     /**
  40.      * @var TranslatorInterface
  41.      */
  42.     private TranslatorInterface $translator;
  43.     /**
  44.      * @var RouterInterface
  45.      */
  46.     private RouterInterface $router;
  47.     private SiteByHostNameProvider $siteByHostNameProvider;
  48.     public function __construct(
  49.         RedirectionManager $redirectionManager,
  50.         SiteManager $siteManager,
  51.         SlugManager $slugManager,
  52.         SessionInterface $session,
  53.         TranslatorInterface $translator,
  54.         RouterInterface $router,
  55.         SiteByHostNameProvider $siteByHostNameProvider
  56.     )
  57.     {
  58.         $this->redirectionManager $redirectionManager;
  59.         $this->siteManager $siteManager;
  60.         $this->slugManager $slugManager;
  61.         $this->session $session;
  62.         $this->translator $translator;
  63.         $this->router $router;
  64.         $this->siteByHostNameProvider $siteByHostNameProvider;
  65.     }
  66.     
  67.     public static function getSubscribedEvents(): array
  68.     {
  69.         return [
  70.             KernelEvents::EXCEPTION => ['onKernelException'2],
  71.         ];
  72.     }
  73.     
  74.     public function onKernelException(ExceptionEvent $event): void
  75.     {
  76.         $exception $event->getThrowable();
  77.         
  78.         if($exception instanceof AuthFailException){
  79.             $route = ($this->isAdmin($event->getRequest()))
  80.                 ? 'user_security_admin_login'
  81.                 'user_security_login';
  82.             $this->sendError($event$exception->getMessage(), 400$route);
  83.         }
  84.         
  85.         if($exception instanceof AccessDeniedException){
  86.             $route = ($this->isAdmin($event->getRequest()))
  87.                 ? 'user_security_admin_login'
  88.                 'user_security_login';
  89.             $this->sendError($event$exception->getMessage(), 403$route);
  90.         }
  91.         
  92.         if ($exception instanceof NotFoundHttpException) {
  93.             $this->notFoundHandler($event);
  94.         }
  95.     }
  96.     
  97.     public function sendError(ExceptionEvent $event$message$status null$redirectToRoute null){
  98.         if($this->isApi($event->getRequest())){
  99.             $event->setResponse(new JsonResponse(['message' => $message], $status));
  100.         }
  101.         else{
  102.             $this->session->getFlashBag()->add('notice_error'$message);
  103.             if ($redirectToRoute){
  104.                 $response = new RedirectResponse($this->router->generate($redirectToRoute));
  105.                 $event->setResponse($response);
  106.             }
  107.         }
  108.     }
  109.     
  110.     public function notFoundHandler(ExceptionEvent $event){
  111.         $request $event->getRequest();
  112.         if(
  113.             !$this->isDebugBar($event->getRequest())
  114.             and !$this->isResource($event->getRequest())
  115.             and !$this->isApi($event->getRequest())
  116.             and !$this->isAdmin($event->getRequest())) {
  117.             // Checking if their is redirection for this uri
  118.             $redirection $this->redirectionManager->getRedirectionFromUrl($request->getRequestUri());
  119.             $site $this->siteManager->getSite() ?: $this->siteByHostNameProvider->get($event);
  120.             if ($redirection
  121.                 and $url $this->redirectionManager->getTargetUrl($redirection)
  122.                 and $url != $request->getRequestUri()) {
  123.                     $response = new RedirectResponse($url$redirection->getStatus());
  124.                     $event->setResponse($response);
  125.             }
  126.             // Render 404 cms site content page when response has 404 status code, not in admin panel
  127.             elseif ($site
  128.                 and !$this->isAdmin($request)
  129.                 and $page $site->getRedirectPageOn404()) {
  130.                 $response = new Response($this->slugManager->forwardSlug($page->getSlugEntity(), $request)->getContent(), 404);
  131.                 $event->setResponse($response);
  132.             }
  133.         }
  134.     }
  135.     
  136.     private function isApi(Request $request)
  137.     {
  138.         if (!empty(preg_match("#^/api/#i"$request->getRequestUri(), $matches))) {
  139.             return true;
  140.         }
  141.         
  142.         return false;
  143.     }
  144.     
  145.     private function isAdmin(Request $request)
  146.     {
  147.         if (!empty(preg_match("#^/admin/#i"$request->getRequestUri(), $matches))) {
  148.             return true;
  149.         }
  150.         
  151.         return false;
  152.     }
  153.     
  154.     private function isDebugBar(Request $request)
  155.     {
  156.         if (!empty(preg_match("#^/_wdt/#i"$request->getRequestUri(), $matches))) {
  157.             return true;
  158.         }
  159.         
  160.         return false;
  161.     }
  162.     
  163.     private function isResource(Request $request)
  164.     {
  165.         if (!empty(preg_match("#^/bundles/#i"$request->getRequestUri(), $matches))) {
  166.             return true;
  167.         }
  168.         
  169.         return false;
  170.     }
  171. }