src/EventSubscriber/ModuleAccessSubscriber.php line 48

Open in your IDE?
  1. <?php
  2. namespace App\EventSubscriber;
  3. use App\Entity\User;
  4. use App\Service\ConfigService;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use Symfony\Component\HttpKernel\KernelEvents;
  9. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  10. use Symfony\Component\Security\Core\Security;
  11. /**
  12.  * Bloque l'accès direct (URL tapée à la main) aux routes des modules
  13.  * désactivés pour l'entreprise du client connecté.
  14.  */
  15. class ModuleAccessSubscriber implements EventSubscriberInterface
  16. {
  17.     // L'ordre compte : client_tv_teamplay doit être testé avant client_tv
  18.     private const ROUTE_FLAGS = [
  19.         'client_tv_teamplay'      => 'displayChallenge',
  20.         'client_tv'               => 'displayVideo',
  21.         'client_live_reservation' => 'displayActivity',
  22.         'client_live_mybooking'   => 'displayPlanning',
  23.         'client_partner'          => 'displayService',
  24.     ];
  25.     private $security;
  26.     private $configService;
  27.     private $router;
  28.     public function __construct(Security $security, ConfigService $configService, UrlGeneratorInterface $router)
  29.     {
  30.         $this->security      = $security;
  31.         $this->configService = $configService;
  32.         $this->router        = $router;
  33.     }
  34.     public static function getSubscribedEvents(): array
  35.     {
  36.         return [
  37.             KernelEvents::REQUEST => 'onKernelRequest',
  38.         ];
  39.     }
  40.     public function onKernelRequest(RequestEvent $event): void
  41.     {
  42.         if (!$event->isMainRequest()) {
  43.             return;
  44.         }
  45.         $route = (string) $event->getRequest()->attributes->get('_route');
  46.         $flag  = null;
  47.         foreach (self::ROUTE_FLAGS as $prefix => $routeFlag) {
  48.             if (strpos($route, $prefix) === 0) {
  49.                 $flag = $routeFlag;
  50.                 break;
  51.             }
  52.         }
  53.         if (!$flag) {
  54.             return;
  55.         }
  56.         $user = $this->security->getUser();
  57.         if (!$user instanceof User || !$user->getClient() || !$user->getClient()->getCompany()) {
  58.             return;
  59.         }
  60.         $menuConfig = $this->configService->getMenuConfigForCompany($user->getClient()->getCompany());
  61.         if (empty($menuConfig[$flag])) {
  62.             $event->setResponse(new RedirectResponse($this->router->generate('client_dashboard')));
  63.         }
  64.     }
  65. }