<?php
namespace App\EventSubscriber;
use App\Entity\Log;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ControllerEvent;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Twig\Error\LoaderError;
use Twig\Error\RuntimeError;
use Twig\Error\SyntaxError;
class LoginAtSubscriber implements EventSubscriberInterface
{
private TokenStorageInterface $tokenStorage;
private EntityManagerInterface $em;
public function __construct(TokenStorageInterface $tokenStorage,EntityManagerInterface $em)
{
$this->tokenStorage = $tokenStorage;
$this->em = $em;
}
/**
* @param RequestEvent $event
* @return void
* @throws LoaderError
* @throws RuntimeError
* @throws SyntaxError
*/
public function onKernelRequest(ControllerEvent $event)
{
if (!$event->isMainRequest()) {
// don't do anything if it's not the master request
return;
}
if($this->tokenStorage->getToken()){
/* @var $user User*/
$user = $this->tokenStorage->getToken()->getUser();
if($user && $user instanceof User){
$lastLoginAt = $user->getLastLoginAt();
$now = new \DateTime("now", new \DateTimeZone("Europe/Paris"));
$diffInSeconds = abs($lastLoginAt->getTimestamp() - $now->getTimestamp());
if ($diffInSeconds > 5 * 3600) {
//Update loginAt
$user->setLastLoginAt($now);
$this->em->persist($user);
//Create log
$log = new Log();
$log->setUser( $user );
$log->setEvent('login');
$log->setSources(['ip'=>!empty($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : "",'date'=>$now->format('Y-m-d H:i'),'login'=>$user->getEmail()]);
$this->em->persist($log);
$this->em->flush();
}
}
}
}
public static function getSubscribedEvents()
{
return [
KernelEvents::CONTROLLER=> [
['onKernelRequest',10]
],
];
}
}