src/Bundles/DiseaseCaseBundle/EventListener/DiseaseCasePermissionExceptionEventListener.php line 25

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Bundles\DiseaseCaseBundle\EventListener;
  4. use App\Platform\Service\SessionProvider;
  5. use Symfony\Component\EventDispatcher\Attribute\AsEventListener;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpFoundation\RequestStack;
  8. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  9. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  10. use Symfony\Component\Routing\RouterInterface;
  11. #[AsEventListener]
  12. class DiseaseCasePermissionExceptionEventListener
  13. {
  14.     public function __construct(
  15.         private readonly RequestStack $requestStack,
  16.         private readonly RouterInterface $urlGenerator,
  17.         private readonly SessionProvider $sessionProvider,
  18.     ) {
  19.     }
  20.     public function __invoke(ExceptionEvent $event): void
  21.     {
  22.         if (!$event->getThrowable() instanceof AccessDeniedHttpException) {
  23.             return;
  24.         }
  25.         if (!$request $this->requestStack->getMainRequest()) {
  26.             return;
  27.         }
  28.         if (!$request->attributes->get('diseaseCase')) {
  29.             return;
  30.         }
  31.         /** @var \Symfony\Component\HttpFoundation\Session\Session $session */
  32.         $session $this->sessionProvider->provide();
  33.         $session->getFlashBag()->add('permission_denied''');
  34.         $referer $request->headers->get('referer');
  35.         if ($referer && $this->possibleRedirects($referer)) {
  36.             $event->setResponse(new RedirectResponse($referer));
  37.             return;
  38.         }
  39.         $event->setResponse(new RedirectResponse($this->urlGenerator->generate('disease-cases.index')));
  40.     }
  41.     public function possibleRedirects(string $referer): bool
  42.     {
  43.         return str_contains($referer'patients') ||
  44.             str_contains($referer'outbreaks');
  45.     }
  46. }