vendor/nellapp/sdk-bundle/src/Auth/EventSubscriber/LogoutSubscriber.php line 39

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the nellapp-core package.
  4.  *
  5.  * (c) Benjamin Georgeault
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Nellapp\Bundle\SDKBundle\Auth\EventSubscriber;
  11. use Nellapp\Bundle\SDKBundle\Auth\Entity\UserInterface;
  12. use Nellapp\Bundle\SDKBundle\Routing\UrlGeneratorInterface;
  13. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  14. use Symfony\Component\HttpFoundation\RedirectResponse;
  15. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  16. use Symfony\Component\Security\Http\Event\LogoutEvent;
  17. /**
  18.  * Class LogoutSubscriber
  19.  *
  20.  * @author Benjamin Georgeault
  21.  */
  22. class LogoutSubscriber implements EventSubscriberInterface
  23. {
  24.     public function __construct(
  25.         private UrlGeneratorInterface $urlGenerator,
  26.     ) {}
  27.     public static function getSubscribedEvents(): array
  28.     {
  29.         return [
  30.             LogoutEvent::class => 'logout',
  31.         ];
  32.     }
  33.     public function logout(LogoutEvent $event): void
  34.     {
  35.         $request $event->getRequest();
  36.         if (null === $this->getUser($event->getToken()) && !$request->hasSession()) {
  37.             return;
  38.         }
  39.         // If session expired, prevent redirect.
  40.         $bag $request->getSession()->getMetadataBag();
  41.         if (time() > $bag->getLastUsed() + $bag->getLifetime() ) {
  42.             return;
  43.         }
  44.         $redirect = new RedirectResponse($this->urlGenerator->generate('core''app_logout'));
  45.         if ((null !== $previousResponse $event->getResponse()) && $previousResponse instanceof RedirectResponse) {
  46.             $redirect->setTargetUrl(
  47.                 $redirect->getTargetUrl() . '?target=' $previousResponse->getTargetUrl(),
  48.             );
  49.         }
  50.         $event->setResponse($redirect);
  51.     }
  52.     private function getUser(?TokenInterface $token): ?UserInterface
  53.     {
  54.         if (($user $token?->getUser()) instanceof UserInterface) {
  55.             return $user;
  56.         }
  57.         return null;
  58.     }
  59. }