namespace Symfony\Component\HttpKernel\EventListener;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
use Symfony\Component\HttpKernel\KernelEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Sets the session in the request.
*/
abstract class AbstractSessionListener implements EventSubscriberInterface
{
+ private $sessionUsageStack = array();
+
public function onKernelRequest(GetResponseEvent $event)
{
if (!$event->isMasterRequest()) {
$request = $event->getRequest();
$session = $this->getSession();
+ $this->sessionUsageStack[] = $session instanceof Session ? $session->getUsageIndex() : null;
if (null === $session || $request->hasSession()) {
return;
}
return;
}
- if ($session->isStarted() || ($session instanceof Session && $session->hasBeenStarted())) {
+ if ($session instanceof Session ? $session->getUsageIndex() !== end($this->sessionUsageStack) : $session->isStarted()) {
$event->getResponse()
->setPrivate()
->setMaxAge(0)
}
}
+ /**
+ * @internal
+ */
+ public function onFinishRequest(FinishRequestEvent $event)
+ {
+ if ($event->isMasterRequest()) {
+ array_pop($this->sessionUsageStack);
+ }
+ }
+
public static function getSubscribedEvents()
{
return array(
KernelEvents::REQUEST => array('onKernelRequest', 128),
// low priority to come after regular response listeners, same as SaveSessionListener
KernelEvents::RESPONSE => array('onKernelResponse', -1000),
+ KernelEvents::FINISH_REQUEST => array('onFinishRequest'),
);
}