Edit file File name : LastLoginSubscriber.php Content :<?php /* * This file is part of the Kimai time-tracking app. * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace App\EventSubscriber; use App\Entity\User; use App\Event\UserInteractiveLoginEvent; use App\Repository\UserRepository; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\Security\Guard\Token\PostAuthenticationGuardToken; use Symfony\Component\Security\Http\Event\InteractiveLoginEvent; use Symfony\Component\Security\Http\SecurityEvents; class LastLoginSubscriber implements EventSubscriberInterface { private $repository; public function __construct(UserRepository $repository) { $this->repository = $repository; } /** * @return array */ public static function getSubscribedEvents() { return [ UserInteractiveLoginEvent::class => 'onImplicitLogin', SecurityEvents::INTERACTIVE_LOGIN => 'onSecurityInteractiveLogin', ]; } public function onImplicitLogin(UserInteractiveLoginEvent $event) { $user = $event->getUser(); $user->setLastLogin(new \DateTime()); $this->repository->saveUser($user); } public function onSecurityInteractiveLogin(InteractiveLoginEvent $event) { // do not count API calls as logins // this point could be used to add API rate limitation in the future if ($event->getAuthenticationToken() instanceof PostAuthenticationGuardToken) { return; } $user = $event->getAuthenticationToken()->getUser(); if ($user instanceof User) { $user->setLastLogin(new \DateTime()); $this->repository->saveUser($user); } } } Save