src/Event/KernelRequestEvent.php line 50

Open in your IDE?
  1. <?php
  2. namespace App\Event;
  3. use App\Controller\Calendar\CalendarEventController;
  4. use App\Controller\LearningCourses\LearningCourseController;
  5. use App\Controller\OnlineShop\FamilyController;
  6. use App\Controller\OnlineShop\ProductController;
  7. use App\Controller\OnlineShop\ShopController;
  8. use App\Controller\OnlineShop\SuperFamilyController;
  9. use App\Controller\OnlineShop\SupplierController;
  10. use App\Controller\PurchaseTracking\PurchaseTrackingController;
  11. use App\Doctrine\Filter\SatisfactionSurveyFilter;
  12. use App\Doctrine\Filter\SiteFilter;
  13. use App\Entity\SatisfactionSurveys\SatisfactionSurvey;
  14. use App\Enum\MenuRolesAssociatedEnum;
  15. use App\Enum\MenuRolesManagerEnum;
  16. use App\Enum\UserRolesEnum;
  17. use App\Kernel;
  18. use App\Repository\SatisfactionSurveys\SatisfactionSurveyRepository;
  19. use Doctrine\Common\Annotations\Reader;
  20. use Doctrine\ORM\EntityManagerInterface;
  21. use Doctrine\ORM\Query\Filter\SQLFilter;
  22. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  23. use Symfony\Component\HttpFoundation\Request;
  24. use Symfony\Component\HttpFoundation\RequestStack;
  25. use Symfony\Component\HttpKernel\Event\RequestEvent;
  26. use Symfony\Component\Security\Core\Security;
  27. use Symfony\Component\Security\Core\User\UserInterface;
  28. class KernelRequestEvent
  29. {
  30.     private EntityManagerInterface $em;
  31.     private RequestStack $requestStack;
  32.     private Security $security;
  33.     private SatisfactionSurveyRepository $ssr;
  34.     private Reader $ar;
  35.     private ParameterBagInterface $pb;
  36.     public function __construct(EntityManagerInterface $emRequestStack $requestStackSecurity $securitySatisfactionSurveyRepository $ssrReader $arParameterBagInterface $pb)
  37.     {
  38.         $this->em $em;
  39.         $this->requestStack $requestStack;
  40.         $this->security $security;
  41.         $this->ssr $ssr;
  42.         $this->ar $ar;
  43.         $this->pb $pb;
  44.     }
  45.     public function onKernelRequest(RequestEvent $event): void
  46.     {
  47.         $user $this->getUser();
  48.         $request $event->getRequest();
  49.         /** @var SiteFilter $siteDoctrineFilter */
  50.         $siteDoctrineFilter $this->setSiteFilter($request);
  51.         $siteDoctrineFilter->setAnnotationReader($this->ar);
  52.         /** @var SatisfactionSurveyFilter $satisfactionSurveyDoctrineFilter */
  53.         $satisfactionSurveyDoctrineFilter $this->em->getFilters()->enable('satisfaction_survey_filter');
  54.         $satisfactionSurveyDoctrineFilter->setAnnotationReader($this->ar);
  55.         $satisfactionSurvey $this->ssr->findOneBy([
  56.             'name' => SatisfactionSurvey::getNameByLocale($request->getLocale()),
  57.         ]);
  58.         if ($satisfactionSurvey) {
  59.             $satisfactionSurveyDoctrineFilter->setParameter('survey'$satisfactionSurvey->getId());
  60.         }
  61.         // IMPORTANT NOTE: keep always same 'if' executions order
  62.         if (is_object($user)) {
  63.             if (str_contains($request->get('_controller'), ShopController::class) && (str_contains($request->get('_controller'), 'show') || str_contains($request->get('_controller'), 'edit'))) {
  64.                 // because in order detail we want the published filter disabled to get products buyed in past than now are unpublished
  65.                 $this->disablePublishedFilter();
  66.             }
  67.             if (($this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_ONLINE_SHOP) || $this->security->isGranted(MenuRolesAssociatedEnum::ROLE_MENU_ONLINE_SHOP_ASSOCIATED)) && str_contains($request->get('_controller'), ShopController::class)) {
  68.                 // because in shopController we want the filters enabled
  69.                 return;
  70.             }
  71.             if ($this->security->isGranted(UserRolesEnum::ROLE_MANAGER_LONG) && str_contains($request->getPathInfo(), Kernel::ADMIN_FIREWALL_PATH)) {
  72.                 // because users with ROLE_MANAGER needs the published filter disabled for all the ^/admin route paths
  73.                 $this->disablePublishedFilter();
  74.                 $this->setSiteFilter($request);
  75.             }
  76.             if ($this->security->isGranted(UserRolesEnum::ROLE_ASSOCIATED_MANAGER_LONG) && $this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_LEARNING_PLATFORM) && str_contains($request->get('_controller'), LearningCourseController::class)) {
  77.                 // because users with ROLE_ASSOCIATED_MANAGER and ROLE_MENU_LEARNING_PLATFORM needs the published filter disabled for all the LearningCourseController actions
  78.                 $this->disablePublishedFilter();
  79.             }
  80.             if ($this->security->isGranted(UserRolesEnum::ROLE_ASSOCIATED_MANAGER_LONG) && $this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_ONLINE_SHOP) && str_contains($request->get('_controller'), ProductController::class)) {
  81.                 // because users with ROLE_ASSOCIATED_MANAGER and ROLE_MENU_ONLINE_SHOP needs the published filter disabled for all the LearningCourseController actions
  82.                 $this->disablePublishedFilter();
  83.             }
  84.             if ($this->security->isGranted(UserRolesEnum::ROLE_ASSOCIATED_MANAGER_LONG) && $this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_ONLINE_SHOP) && str_contains($request->get('_controller'), FamilyController::class)) {
  85.                 // because users with ROLE_ASSOCIATED_MANAGER and ROLE_MENU_ONLINE_SHOP needs the published filter disabled for all the FamilyController actions
  86.                 $this->disablePublishedFilter();
  87.             }
  88.             if ($this->security->isGranted(UserRolesEnum::ROLE_ASSOCIATED_MANAGER_LONG) && $this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_ONLINE_SHOP) && str_contains($request->get('_controller'), SuperFamilyController::class)) {
  89.                 // because users with ROLE_ASSOCIATED_MANAGER and ROLE_MENU_ONLINE_SHOP needs the published filter disabled for all the SuperFamilyController actions
  90.                 $this->disablePublishedFilter();
  91.             }
  92.             if ($this->security->isGranted(UserRolesEnum::ROLE_ASSOCIATED_MANAGER_LONG) && $this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_ONLINE_SHOP) && str_contains($request->get('_controller'), SupplierController::class)) {
  93.                 // because users with ROLE_ASSOCIATED_MANAGER and ROLE_MENU_ONLINE_SHOP needs the published filter disabled for all the SupplierController actions
  94.                 $this->disablePublishedFilter();
  95.             }
  96.             if (($this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_PURCHASE_TRACKING) || $this->security->isGranted(MenuRolesAssociatedEnum::ROLE_MENU_PURCHASE_TRACKING_ASSOCIATED)) && str_contains($request->get('_controller'), PurchaseTrackingController::class)) {
  97.                 // because in PurchaseTrackingController we need the published filter disabled to view purchases of disabled suppliers
  98.                 $this->disablePublishedFilter();
  99.             }
  100.             if (($this->security->isGranted(MenuRolesManagerEnum::ROLE_MENU_CALENDAR)) && str_contains($request->get('_controller'), CalendarEventController::class)) {
  101.                 // because in CalendarEventController we need the published filter disabled
  102.                 $this->disablePublishedFilter();
  103.             }
  104.         }
  105.     }
  106.     private function getUser(): ?UserInterface
  107.     {
  108.         if (null === $token $this->security->getToken()) {
  109.             return null;
  110.         }
  111.         if (!is_object($user $token->getUser())) {
  112.             return null;
  113.         }
  114.         return $user;
  115.     }
  116.     private function setSiteFilter(Request $request): SQLFilter
  117.     {
  118.         $siteDoctrineFilter $this->em->getFilters()->enable('site_filter');
  119.         if (!$this->requestStack->getSession()->has('locale')) {
  120.             $this->requestStack->getSession()->set('locale'$request->getLocale());
  121.         }
  122.         $siteDoctrineFilter->setParameter('site'$request->getLocale());
  123.         return $siteDoctrineFilter;
  124.     }
  125.     private function disablePublishedFilter(): void
  126.     {
  127.         if ($this->em->getFilters()->isEnabled('published_filter')) {
  128.             $this->em->getFilters()->disable('published_filter');
  129.         }
  130.     }
  131. }