src/EventListener/WeActListener.php line 74

Open in your IDE?
  1. <?php declare(strict_types=1);
  2. namespace App\EventListener;
  3. use App\Entity\Advisor;
  4. use App\Entity\SalesAgreement;
  5. use App\Repository\SalesAgreementRepository;
  6. use App\Utils\CommonConstants;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Symfony\Component\Security\Core\Exception\AccessDeniedException;
  11. use Symfony\Component\Security\Core\Security;
  12. /**
  13.  * Class WeActListener
  14.  * @package App\EventListener
  15.  */
  16. class WeActListener implements EventSubscriberInterface
  17. {
  18.     /** @var SalesAgreementRepository */
  19.     private $saleAgreementRepository;
  20.     /** @var Security */
  21.     private $security;
  22.     /**
  23.      * WeActListener constructor.
  24.      *
  25.      * @param SalesAgreementRepository $saleAgreementRepository
  26.      * @param Security $security
  27.      */
  28.     public function __construct(
  29.         SalesAgreementRepository $saleAgreementRepository,
  30.         Security $security
  31.     ) {
  32.         $this->saleAgreementRepository $saleAgreementRepository;
  33.         $this->security $security;
  34.     }
  35.     /**
  36.      * Returns an array of event names this subscriber wants to listen to.
  37.      *
  38.      * The array keys are event names and the value can be:
  39.      *
  40.      *  * The method name to call (priority defaults to 0)
  41.      *  * An array composed of the method name to call and the priority
  42.      *  * An array of arrays composed of the method names to call and respective
  43.      *    priorities, or 0 if unset
  44.      *
  45.      * For instance:
  46.      *
  47.      *  * ['eventName' => 'methodName']
  48.      *  * ['eventName' => ['methodName', $priority]]
  49.      *  * ['eventName' => [['methodName1', $priority], ['methodName2']]]
  50.      *
  51.      * The code must not depend on runtime state as it will only be called at compile time.
  52.      * All logic depending on runtime state must be put into the individual methods handling the events.
  53.      *
  54.      * @return array The event names to listen to
  55.      */
  56.     public static function getSubscribedEvents(): array
  57.     {
  58.         return [
  59.                 KernelEvents::REQUEST => [['onKernelRequest']],
  60.         ];
  61.     }
  62.     /**
  63.      * @param RequestEvent $events
  64.      *
  65.      */
  66.     public function onKernelRequest(RequestEvent $events)
  67.     {
  68.         $request $events->getRequest();
  69.         $user $this->security->getUser();
  70.         $routeParams $request->get('_route_params');
  71.         if (null != $routeParams && null != $user
  72.             && in_array($user->getRoles()[0], CommonConstants::ARRAY_AGENCY_ROLES)) {
  73.             if (key_exists('salesAgreement'$routeParams)) {
  74.                 $salesAgreement $this->saleAgreementRepository->find($routeParams['salesAgreement']);
  75.                 if (null == $salesAgreement || !$this->checkUserVisibility($user$salesAgreement)
  76.                 ) {
  77.                     throw new AccessDeniedException("Vous n'avez pas accès a ce contenu");
  78.                 }
  79.             }
  80.         }
  81.     }
  82.     /**
  83.      * @param $user
  84.      * @param SalesAgreement $salesAgreement
  85.      *
  86.      * @return bool
  87.      */
  88.     private function checkUserVisibility($userSalesAgreement $salesAgreement): bool
  89.     {
  90.         $agencyUser $salesAgreement->getAgencyUser();
  91.         if ($agencyUser instanceof Advisor) {
  92.             return $user == $agencyUser || $user == $agencyUser->getDirector();
  93.         }
  94.         return  $user === $agencyUser;
  95.     }
  96. }