src/Mm/Escmid/EaaBundle/EventSubscriber/LogoutAfterInactivePeriodSubscriber.php line 27

Open in your IDE?
  1. <?php
  2. namespace Mm\Escmid\EaaBundle\EventSubscriber;
  3. use Mm\Escmid\EaaBundle\Platform\RouteChecker;
  4. use Mm\Escmid\EaaBundle\Platform\SystemClock;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\HttpKernel\Event\ResponseEvent;
  8. final readonly class LogoutAfterInactivePeriodSubscriber implements EventSubscriberInterface
  9. {
  10. public function __construct(
  11. private RouteChecker $routeChecker,
  12. private SystemClock $clock,
  13. ) {
  14. // --
  15. }
  16. public static function getSubscribedEvents(): array
  17. {
  18. return [
  19. ResponseEvent::class => ['onKernelResponse'],
  20. ];
  21. }
  22. public function onKernelResponse(ResponseEvent $event): void
  23. {
  24. if (!$event->isMainRequest()) {
  25. return;
  26. }
  27. $request = $event->getRequest();
  28. if ($this->routeChecker->checkIfThisRouteRequireNoLogin($request->getRequestUri())) {
  29. return;
  30. }
  31. $session = $request->getSession();
  32. $shouldLogoutAt = $session->get('shouldLogoutAt');
  33. $this->handleUserLogout($shouldLogoutAt,
  34. function () use ($event) {
  35. $event->setResponse(new RedirectResponse('/logout'));
  36. },
  37. function () use ($session) {
  38. $session->set('shouldLogoutAt', $this->clock->now()->modify('+30 minutes'));
  39. }
  40. );
  41. }
  42. public function handleUserLogout(?\DateTimeImmutable $logoutTime, \Closure $onLogout, \Closure $onContinueSession): void
  43. {
  44. if ($logoutTime instanceof \DateTimeImmutable && $this->clock->now() > $logoutTime) {
  45. $onLogout();
  46. return;
  47. }
  48. $onContinueSession();
  49. }
  50. }