Skip to content

Commit 2626c82

Browse files
[HttpKernel] Fix setting the session on the main request when it's started by a subrequest
1 parent 559c624 commit 2626c82

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

EventListener/AbstractSessionListener.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ public function onKernelRequest(RequestEvent $event)
7272
$request->setSessionFactory(function () use (&$sess, $request) {
7373
if (!$sess) {
7474
$sess = $this->getSession();
75+
$request->setSession($sess);
7576

7677
/*
7778
* For supporting sessions in php runtime with runners like roadrunner or swoole, the session

Tests/EventListener/SessionListenerTest.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,27 @@ public function testGetSessionIsCalledOnce()
691691
$subRequest->getSession();
692692
}
693693

694+
public function testGetSessionSetsSessionOnMainRequest()
695+
{
696+
$mainRequest = new Request();
697+
$listener = $this->createListener($mainRequest, new NativeSessionStorageFactory());
698+
699+
$event = new RequestEvent($this->createMock(HttpKernelInterface::class), $mainRequest, HttpKernelInterface::MAIN_REQUEST);
700+
$listener->onKernelRequest($event);
701+
702+
$this->assertFalse($mainRequest->hasSession(true));
703+
704+
$subRequest = $mainRequest->duplicate();
705+
706+
$event = new RequestEvent($this->createMock(HttpKernelInterface::class), $subRequest, HttpKernelInterface::SUB_REQUEST);
707+
$listener->onKernelRequest($event);
708+
709+
$session = $subRequest->getSession();
710+
711+
$this->assertTrue($mainRequest->hasSession(true));
712+
$this->assertSame($session, $mainRequest->getSession());
713+
}
714+
694715
public function testSessionUsageExceptionIfStatelessAndSessionUsed()
695716
{
696717
$session = $this->createMock(Session::class);

0 commit comments

Comments
 (0)