vendor/symfony/http-kernel/EventListener/AbstractTestSessionListener.php line 40

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <[email protected]>
  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 Symfony\Component\HttpKernel\EventListener;
  11. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  12. use Symfony\Component\HttpFoundation\Cookie;
  13. use Symfony\Component\HttpFoundation\Session\Session;
  14. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  15. use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
  16. use Symfony\Component\HttpKernel\Event\GetResponseEvent;
  17. use Symfony\Component\HttpKernel\KernelEvents;
  18. /**
  19.  * TestSessionListener.
  20.  *
  21.  * Saves session in test environment.
  22.  *
  23.  * @author Bulat Shakirzyanov <[email protected]>
  24.  * @author Fabien Potencier <[email protected]>
  25.  */
  26. abstract class AbstractTestSessionListener implements EventSubscriberInterface
  27. {
  28.     private $sessionId;
  29.     private $sessionOptions;
  30.     public function __construct(array $sessionOptions = [])
  31.     {
  32.         $this->sessionOptions $sessionOptions;
  33.     }
  34.     public function onKernelRequest(GetResponseEvent $event)
  35.     {
  36.         if (!$event->isMasterRequest()) {
  37.             return;
  38.         }
  39.         // bootstrap the session
  40.         $session $this->getSession();
  41.         if (!$session) {
  42.             return;
  43.         }
  44.         $cookies $event->getRequest()->cookies;
  45.         if ($cookies->has($session->getName())) {
  46.             $this->sessionId $cookies->get($session->getName());
  47.             $session->setId($this->sessionId);
  48.         }
  49.     }
  50.     /**
  51.      * Checks if session was initialized and saves if current request is master
  52.      * Runs on 'kernel.response' in test environment.
  53.      */
  54.     public function onKernelResponse(FilterResponseEvent $event)
  55.     {
  56.         if (!$event->isMasterRequest()) {
  57.             return;
  58.         }
  59.         $request $event->getRequest();
  60.         if (!$request->hasSession()) {
  61.             return;
  62.         }
  63.         $session $request->getSession();
  64.         if ($wasStarted $session->isStarted()) {
  65.             $session->save();
  66.         }
  67.         if ($session instanceof Session ? !$session->isEmpty() || (null !== $this->sessionId && $session->getId() !== $this->sessionId) : $wasStarted) {
  68.             $params session_get_cookie_params() + ['samesite' => null];
  69.             foreach ($this->sessionOptions as $k => $v) {
  70.                 if (=== strpos($k'cookie_')) {
  71.                     $params[substr($k7)] = $v;
  72.                 }
  73.             }
  74.             foreach ($event->getResponse()->headers->getCookies() as $cookie) {
  75.                 if ($session->getName() === $cookie->getName() && $params['path'] === $cookie->getPath() && $params['domain'] == $cookie->getDomain()) {
  76.                     return;
  77.                 }
  78.             }
  79.             $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), === $params['lifetime'] ? time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly'], false$params['samesite'] ?: null));
  80.             $this->sessionId $session->getId();
  81.         }
  82.     }
  83.     public static function getSubscribedEvents()
  84.     {
  85.         return [
  86.             KernelEvents::REQUEST => ['onKernelRequest'192],
  87.             KernelEvents::RESPONSE => ['onKernelResponse', -128],
  88.         ];
  89.     }
  90.     /**
  91.      * Gets the session object.
  92.      *
  93.      * @return SessionInterface|null A SessionInterface instance or null if no session is available
  94.      */
  95.     abstract protected function getSession();
  96. }