src/EventSubscribers/LogoutSubscriber.php line 39

  1. <?php
  2. namespace App\EventSubscribers;
  3. use App\Repository\SessionRepository;
  4. use App\Repository\UserRepository;
  5. use DateTimeImmutable;
  6. use Symfony\Bundle\SecurityBundle\Security;
  7. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  8. use Symfony\Component\HttpFoundation\RedirectResponse;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
  11. use Symfony\Component\Security\Http\Event\LogoutEvent;
  12. use Symfony\Component\Security\Http\Firewall\LogoutListener;
  13. class LogoutSubscriber implements EventSubscriberInterface
  14. {
  15.     private UserRepository $userRepository;
  16.     private SessionRepository $sessionRepository;
  17.     private $security;
  18.     /**
  19.      * @param UrlGeneratorInterface $urlGenerator
  20.      * @param UserRepository $userRepository
  21.      * @param SessionRepository $sessionRepository
  22.      */
  23.     public function __construct(private UrlGeneratorInterface $urlGeneratorUserRepository $userRepositorySessionRepository $sessionRepositorySecurity $security)
  24.     {
  25.         $this->userRepository $userRepository;
  26.         $this->sessionRepository $sessionRepository;
  27.         $this->security $security;
  28.     }
  29.     public static function getSubscribedEvents(): array
  30.     {
  31.         return [LogoutEvent::class => 'onLogout'];
  32.     }
  33.     public function onLogout(LogoutEvent $event): void
  34.     {
  35.         $user $this->security->getUser();
  36.         if($user){
  37.             $session $this->sessionRepository->findOneBy([
  38.                 'user' => $user,
  39.                 'isActivated' => 1,
  40.                 'isDeleted' => 0,
  41.             ], orderBy: [
  42.                 'id' => 'DESC'
  43.             ]);
  44.             $session->setUpdatedAt(new DateTimeImmutable());
  45.             $session->setIsActivated(0);
  46.             $session->setIsDeleted(1);
  47.             $this->sessionRepository->save($sessiontrue);
  48.         }
  49.         // get the security token of the session that is about to be logged out
  50.         $token $event->getToken();
  51.         // get the current request
  52.         $request $event->getRequest();
  53.         // get the current response, if it is already set by another listener
  54.         $response $event->getResponse();
  55.         // configure a custom logout response to the homepage
  56.         $response = new RedirectResponse(
  57.             $this->urlGenerator->generate('app_home'),
  58.             Response::HTTP_SEE_OTHER
  59.         );
  60.         $event->setResponse($response);
  61.     }
  62. }