src/EventSubscriber/SessionTimeoutSubscriber.php line 34

  1. <?php
  2. namespace App\EventSubscriber;
  3. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  4. use Symfony\Component\HttpKernel\Event\RequestEvent;
  5. use Symfony\Component\Security\Core\Security;
  6. use Symfony\Component\HttpFoundation\RedirectResponse;
  7. use Symfony\Component\Routing\RouterInterface;
  8. use Psr\Log\LoggerInterface;
  9. class SessionTimeoutSubscriber implements EventSubscriberInterface
  10. {
  11.     private const TIMEOUT 3600;
  12.     public function __construct(
  13.         private Security $security,
  14.         private RouterInterface $router,
  15.         private LoggerInterface $logger
  16.     ) {}
  17.     public function onKernelRequest(RequestEvent $event): void
  18.     {
  19.         $request $event->getRequest();
  20.         if (!$request->hasSession()) {
  21.             return;
  22.         }
  23.         $session $request->getSession();
  24.         $now time();
  25.         if (!$session->has('last_activity')) {
  26.             $session->set('last_activity'$now);
  27.             return;
  28.         }
  29.         $lastActivity $session->get('last_activity');
  30.         $elapsed $now $lastActivity;
  31.         
  32.         $currentRoute $request->attributes->get('_route');
  33.         if ($elapsed self::TIMEOUT) {
  34.             if ($currentRoute === 'session_timeout_controller') {
  35.                 return;
  36.             }
  37.             $response = new RedirectResponse($this->router->generate('session_timeout_controller'));
  38.             $event->setResponse($response);
  39.             return;
  40.         }
  41.         $ignoredRoutes = ['_wdt''_profiler''_profiler_toolbar''_profiler_search''_profiler_search_bar''_profiler_phpinfo'];
  42.         if (!in_array($currentRoute$ignoredRoutestrue)) {
  43.             $session->set('last_activity'$now);
  44.         }
  45.         
  46.     }
  47.     public static function getSubscribedEvents(): array
  48.     {
  49.         return [
  50.             RequestEvent::class => ['onKernelRequest'0],
  51.         ];
  52.     }
  53. }