vendor/symfony/symfony/src/Symfony/Component/HttpKernel/EventListener/AbstractTestSessionListener.php line 34

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  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 <mallluhuct@gmail.com>
  24.  * @author Fabien Potencier <fabien@symfony.com>
  25.  */
  26. abstract class AbstractTestSessionListener implements EventSubscriberInterface
  27. {
  28.     private $sessionId;
  29.     public function onKernelRequest(GetResponseEvent $event)
  30.     {
  31.         if (!$event->isMasterRequest()) {
  32.             return;
  33.         }
  34.         // bootstrap the session
  35.         $session $this->getSession();
  36.         if (!$session) {
  37.             return;
  38.         }
  39.         $cookies $event->getRequest()->cookies;
  40.         if ($cookies->has($session->getName())) {
  41.             $this->sessionId $cookies->get($session->getName());
  42.             $session->setId($this->sessionId);
  43.         }
  44.     }
  45.     /**
  46.      * Checks if session was initialized and saves if current request is master
  47.      * Runs on 'kernel.response' in test environment.
  48.      */
  49.     public function onKernelResponse(FilterResponseEvent $event)
  50.     {
  51.         if (!$event->isMasterRequest()) {
  52.             return;
  53.         }
  54.         if (!$session $event->getRequest()->getSession()) {
  55.             return;
  56.         }
  57.         if ($wasStarted $session->isStarted()) {
  58.             $session->save();
  59.         }
  60.         if ($session instanceof Session ? !$session->isEmpty() || (null !== $this->sessionId && $session->getId() !== $this->sessionId) : $wasStarted) {
  61.             $params session_get_cookie_params();
  62.             foreach ($event->getResponse()->headers->getCookies() as $cookie) {
  63.                 if ($session->getName() === $cookie->getName() && $params['path'] === $cookie->getPath() && $params['domain'] == $cookie->getDomain()) {
  64.                     return;
  65.                 }
  66.             }
  67.             $event->getResponse()->headers->setCookie(new Cookie($session->getName(), $session->getId(), === $params['lifetime'] ? time() + $params['lifetime'], $params['path'], $params['domain'], $params['secure'], $params['httponly']));
  68.             $this->sessionId $session->getId();
  69.         }
  70.     }
  71.     public static function getSubscribedEvents()
  72.     {
  73.         return [
  74.             KernelEvents::REQUEST => ['onKernelRequest'192],
  75.             KernelEvents::RESPONSE => ['onKernelResponse', -128],
  76.         ];
  77.     }
  78.     /**
  79.      * Gets the session object.
  80.      *
  81.      * @return SessionInterface|null A SessionInterface instance or null if no session is available
  82.      */
  83.     abstract protected function getSession();
  84. }