src/Doctrine/TenantFilterSubscriber.php line 34

Open in your IDE?
  1. <?php
  2. namespace App\Doctrine;
  3. use App\Service\EntrepriseResolver;
  4. use Doctrine\ORM\EntityManagerInterface;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpKernel\Event\RequestEvent;
  7. use Symfony\Component\HttpKernel\KernelEvents;
  8. use Symfony\Component\Security\Core\Security;
  9. /**
  10.  * Active TenantFilter pour la requête HTTP courante, une fois l'utilisateur
  11.  * authentifié (priorité < 8 : après le firewall).
  12.  */
  13. class TenantFilterSubscriber implements EventSubscriberInterface
  14. {
  15.     private $entityManager;
  16.     private $security;
  17.     private $entrepriseResolver;
  18.     public function __construct(EntityManagerInterface $entityManager, Security $security, EntrepriseResolver $entrepriseResolver)
  19.     {
  20.         $this->entityManager = $entityManager;
  21.         $this->security = $security;
  22.         $this->entrepriseResolver = $entrepriseResolver;
  23.     }
  24.     public static function getSubscribedEvents(): array
  25.     {
  26.         return [KernelEvents::REQUEST => ['onKernelRequest', 5]];
  27.     }
  28.     public function onKernelRequest(RequestEvent $event): void
  29.     {
  30.         if (!$event->isMainRequest()) {
  31.             return;
  32.         }
  33.         $filters = $this->entityManager->getFilters();
  34.         if ($filters->isEnabled('tenant')) {
  35.             $filters->disable('tenant');
  36.         }
  37.         if (!$this->security->getUser() || $this->security->isGranted('ROLE_ADMIN')) {
  38.             return;
  39.         }
  40.         $owner = $this->entrepriseResolver->getOwnerUser();
  41.         // Sans propriétaire résolu, on filtre sur un id impossible : aucune donnée.
  42.         $filters->enable('tenant')->setParameter('owner_id', $owner ? $owner->getId() : 0);
  43.     }
  44. }