src/EventSubscriber/NotAuthorizedResponseSubscriber.php line 35

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventSubscriber;
  4. use App\Entity\System\Employee;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\Routing\RouterInterface;
  11. use Symfony\Component\Security\Core\Authentication\Token\SwitchUserToken;
  12. use Symfony\Component\Security\Core\Security;
  13. class NotAuthorizedResponseSubscriber implements EventSubscriberInterface
  14. {
  15.     private RouterInterface $router;
  16.     private Security $security;
  17.     public function __construct(
  18.         RouterInterface $router,
  19.         Security $security
  20.     ) {
  21.         $this->router $router;
  22.         $this->security $security;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [KernelEvents::RESPONSE => ['onKernelResponse'1]];
  27.     }
  28.     public function onKernelResponse(ResponseEvent $event): void
  29.     {
  30.         if ($event->getResponse()->getStatusCode() === Response::HTTP_FORBIDDEN) {
  31.             $user $this->security->getUser();
  32.             $token $this->security->getToken();
  33.             if ($user instanceof Employee || $token instanceof SwitchUserToken) {
  34.                 $event->setResponse(new RedirectResponse('/admin/'));
  35.                 return;
  36.             }
  37.             $url $this->router->generate('homepage');
  38.             $event->setResponse(new RedirectResponse($url));
  39.         }
  40.         if (
  41.             $event->getResponse() instanceof RedirectResponse
  42.             && $event->getRequest()->getPathInfo() === '/admin/'
  43.             && str_contains($event->getResponse()->getTargetUrl(), '/account/popuplogin')
  44.         ) {
  45.             $url $this->router->generate('admin_login');
  46.             $event->setResponse(new RedirectResponse($url));
  47.         }
  48.     }
  49. }