<?php
namespace App\EventSubscriber\Subscriber;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
class RequestSubscriber implements EventSubscriberInterface
{
private $em;
private $tokenStorage;
private $security;
public function __construct(
EntityManagerInterface $em,
TokenStorageInterface $tokenStorage,
Security $security
) {
$this->em = $em;
$this->tokenStorage = $tokenStorage;
$this->security = $security;
}
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onKernelRequest',
];
}
public function onKernelRequest(RequestEvent $event)
{
/** @var User $user */
$user = $this->getUser();
if ($user && !$this->security->isGranted(User::ROLE_SAAS) && method_exists($user, "getSaas") && $user->getSaas() !== null) {
$filter = $this->em->getFilters()->enable('saas_filter');
$filter->setParameter('saas_id', $user->getSaas()->getId());
}
}
private function getUser()
{
$token = $this->tokenStorage->getToken();
if (!$token) {
return null;
}
$user = $token->getUser();
if (!($user instanceof UserInterface)) {
return null;
}
return $user;
}
}