<?php
namespace App\EventSubscriber;
use App\Entity\Vetoadom\SessionLog;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
class LogoutSubscriber implements EventSubscriberInterface
{
private $requestStack;
private $vetoadomEntityManager;
public function __construct(
RequestStack $requestStack,
EntityManagerInterface $vetoadomEntityManager
) {
$this->requestStack = $requestStack;
$this->vetoadomEntityManager = $vetoadomEntityManager;
}
public static function getSubscribedEvents(): array
{
return [
LogoutEvent::class => 'onLogoutEvent',
];
}
/**
* @param LogoutEvent $event
*/
public function onLogoutEvent(LogoutEvent $event)
{
$token = $event->getToken();
if (null === $token) {
return;
}
$user = $token->getUser();
if ($user instanceof UserInterface) {
# log session time
$sessionLog = $this->vetoadomEntityManager->getRepository(SessionLog::class)->findOneBy(['userId' => $user->getId()],['id' => 'DESC']);
if ($sessionLog) {
$sessionLog->setDateFin(new \DateTime());
$this->vetoadomEntityManager->flush();
}
# kill session
$this->requestStack->getSession()->invalidate();
}
}
}