<?php
namespace App\EventSubscriber;
use App\Entity\BackUser;
use App\Entity\BackUserLog;
use App\Service\TimezoneService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Http\Event\LogoutEvent;
class LogoutSubscriber implements EventSubscriberInterface
{
/**
* LogoutSubscriber constructor.
*/
public function __construct(
protected EntityManagerInterface $manager,
protected HistorySubscriber $historySubscriber,
protected TimezoneService $timezoneService
) {
}
public function onLogout(LogoutEvent $logoutEvent): void
{
$request = $logoutEvent->getRequest();
$token = $logoutEvent->getToken();
$this->manager->getEventManager()->removeEventListener(
[
'postRemove',
'postPersist',
'postUpdate',
],
$this->historySubscriber
);
if ($token) {
/** @var BackUser $user */
$user = $token->getUser();
if ($user instanceof BackUser) {
$ip = $request->server->get('REMOTE_ADDR');
$this->timezoneService->set($user);
$userLog = new BackUserLog();
$userLog->setType(BackUserLog::TYPE_LOGOUT);
$userLog->setUser($user);
$userLog->setIp($ip);
$userLog->setDate(new DateTime());
$this->manager->persist($userLog);
$this->manager->flush();
}
}
}
/**
* @return array<string, mixed>
*/
public static function getSubscribedEvents(): array
{
return [LogoutEvent::class => 'onLogout'];
}
}