From 5cada3afef60ede1364aa9d4217e41b57f8ab79b Mon Sep 17 00:00:00 2001 From: Samuel ROZE Date: Mon, 13 Nov 2017 13:14:59 +0000 Subject: [PATCH] Just skip PHP's `session_set_save_handler`, not the full `setSaveHandler` method --- .../Session/Storage/NativeSessionStorage.php | 16 +++++++++++++--- .../Session/Storage/NativeSessionStorageTest.php | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php index e35af4e291a70..89daa25a005d9 100644 --- a/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php +++ b/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php @@ -103,8 +103,9 @@ class NativeSessionStorage implements SessionStorageInterface public function __construct(array $options = array(), $handler = null, MetadataBag $metaBag = null) { $this->setMetadataBag($metaBag); + $this->setSaveHandler($handler); - if (\PHP_VERSION_ID >= 50400 && \PHP_SESSION_ACTIVE === session_status()) { + if (!$this->canUpdatePhpSession()) { return; } @@ -121,7 +122,6 @@ public function __construct(array $options = array(), $handler = null, MetadataB } $this->setOptions($options); - $this->setSaveHandler($handler); } /** @@ -408,7 +408,7 @@ public function setSaveHandler($saveHandler = null) } $this->saveHandler = $saveHandler; - if ($this->saveHandler instanceof \SessionHandlerInterface) { + if ($this->saveHandler instanceof \SessionHandlerInterface && $this->canUpdatePhpSession()) { if (\PHP_VERSION_ID >= 50400) { session_set_save_handler($this->saveHandler, false); } else { @@ -449,4 +449,14 @@ protected function loadSession(array &$session = null) $this->started = true; $this->closed = false; } + + /** + * Return true if we can update PHP's session. + * + * @return bool + */ + private function canUpdatePhpSession() + { + return \PHP_VERSION_ID <= 50400 || \PHP_SESSION_ACTIVE !== session_status(); + } } diff --git a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php index 673cd386bf6aa..7eb7e56478ce5 100644 --- a/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php +++ b/src/Symfony/Component/HttpFoundation/Tests/Session/Storage/NativeSessionStorageTest.php @@ -296,4 +296,19 @@ public function testSetSessionOptionsOnceSessionStartedIsIgnored() // Assert no exception has been thrown by `getStorage()` $this->addToAssertionCount(1); } + + /** + * @requires PHP 5.4 + */ + public function testGetBagsOnceSessionStartedIsIgnored() + { + session_start(); + $bag = new AttributeBag(); + $bag->setName('flashes'); + + $storage = $this->getStorage(); + $storage->registerBag($bag); + + $this->assertEquals($storage->getBag('flashes'), $bag); + } }