<?php
namespace App\EventSubscriber;
use App\Entity\User;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Security;
class UserSessionSubscriber implements EventSubscriberInterface
{
public function __construct(
private Security $security,
private RouterInterface $router,
private ManagerRegistry $managerRegistry
) {}
public static function getSubscribedEvents(): array
{
return [
RequestEvent::class => 'onKernelRequest'
];
}
public function onKernelRequest(RequestEvent $event): void
{
if (!$event->isMainRequest()) return;
if ($this->security->getUser()) $this->logoutUser($event, $this->security->getUser());
}
private function logoutUser(RequestEvent $event, User $user): void
{
if ($user->isIsLocked()) {
$event->setResponse(new RedirectResponse($this->router->generate('app_logout')));
$user->setIsLocked(false);
$this->managerRegistry->getManager()->flush();
}
}
}