src/EventSubscriber/KernelSubscriber.php line 53

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use Twig\Environment;
  4. use Symfony\Component\Security\Core\Security;
  5. use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
  6. use Symfony\Component\HttpKernel\Event\{RequestEventResponseEvent};
  7. use Symfony\Component\HttpKernel\Event\ExceptionEvent;
  8. use Symfony\Component\HttpFoundation\{JsonResponseRedirectResponseResponse};
  9. use App\Security\ControllerAccessChecker;
  10. use App\Modules\Menu\Builder\MenuBuilder;
  11. use App\Controller\Web\{LoginControllerEmailControllerDashboardController};
  12. use App\Controller\Web\ProjectsController;
  13. class KernelSubscriber
  14. {
  15.     public function __construct(
  16.         private Environment $twig,
  17.         private Security $security,
  18.         private MenuBuilder $menuBuilder,
  19.         private ControllerAccessChecker $controllerAccessChecker
  20.     ) {
  21.     }
  22.     public function onKernelRequest(RequestEvent $event): void
  23.     {
  24.         $user $this->security->getUser();
  25.         if ($user && !$event->getRequest()->isXmlHttpRequest()) {
  26.             $menuTabs $this->menuBuilder->getMenuTabs($user);
  27.             $this->twig->addGlobal('globalMenuTabs'$menuTabs);
  28.             $request $event->getRequest();
  29.             $availableRoutes array_column($menuTabs'route');
  30.             $availableControllers = [
  31.                 LoginController::class,
  32.                 DashboardController::class,
  33.                 EmailController::class,
  34.                 ProjectsController::class,
  35.             ];
  36.             foreach ($availableRoutes as $route) {
  37.                 $availableControllers[] = MenuBuilder::ROUTES[$route];
  38.             }
  39.             if (!$this->controllerAccessChecker->checkControllerAccess($request$availableControllers)) {
  40.                 throw new NotFoundHttpException();
  41.             }
  42.         }
  43.     }
  44.     public function onKernelResponse(ResponseEvent $event): void
  45.     {
  46.         $responseContent $event->getResponse()->getContent();
  47.         $isXmlHttpRequest $event->getRequest()->isXmlHttpRequest();
  48.         $user $this->security->getUser();
  49.         if ($user && !($event->getResponse() instanceof JsonResponse) && !$isXmlHttpRequest) {
  50.             $menuTabs $this->menuBuilder->getMenuTabs($user);
  51.             $this->twig->addGlobal('globalMenuTabs'$menuTabs);
  52.             $fullOutput $this->twig->render('dashboard.html.twig', ['content' => $responseContent]);
  53.             $event->setResponse(new Response($fullOutput));
  54.         }
  55.         if ($event->getResponse() instanceof RedirectResponse) {
  56.             $event->getResponse()->setContent('');
  57.         }
  58.     }
  59.     public function onKernelException(ExceptionEvent $event)
  60.     {
  61.         $exception $event->getThrowable();
  62.         if ($exception instanceof NotFoundHttpException) {
  63.             $event->setResponse(new Response($this->twig->render('components/404.html.twig')));
  64.         }
  65.     }
  66. }