diff --git a/core/lib/Drupal/Core/TempStore/SharedTempStore.php b/core/lib/Drupal/Core/TempStore/SharedTempStore.php index 2555e22ca88d485aa918401e76d911cb7f49d7ec..6bc0340752758cea5448597f36ca1770d945daf5 100644 --- a/core/lib/Drupal/Core/TempStore/SharedTempStore.php +++ b/core/lib/Drupal/Core/TempStore/SharedTempStore.php @@ -2,6 +2,7 @@ namespace Drupal\Core\TempStore; +use Drupal\Core\DependencyInjection\DependencySerializationTrait; use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface; use Drupal\Core\Lock\LockBackendInterface; use Symfony\Component\HttpFoundation\RequestStack; @@ -37,6 +38,8 @@ */ class SharedTempStore { + use DependencySerializationTrait; + /** * The key/value storage object used for this data. * diff --git a/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php b/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php index f37ddbb956269b1fccb7e607e622cc0db572e799..fccb432f8f7a3777600bf944fbb8aa4f5919501c 100644 --- a/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php +++ b/core/tests/Drupal/Tests/Core/TempStore/SharedTempStoreTest.php @@ -6,6 +6,7 @@ use Drupal\Tests\UnitTestCase; use Drupal\Core\TempStore\SharedTempStore; use Drupal\Core\TempStore\TempStoreException; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\RequestStack; @@ -382,4 +383,32 @@ public function testDeleteIfOwner() { $this->assertFalse($this->tempStore->deleteIfOwner('test_3')); } + /** + * Tests the serialization of a shared temp store. + */ + public function testSerialization() { + // Add an unserializable request to the request stack. If the tempstore + // didn't use DependencySerializationTrait, the exception would be thrown + // when we try to serialize the tempstore. + $request = $this->prophesize(Request::class); + $request->willImplement('\Serializable'); + $request->serialize()->willThrow(new \LogicException('Oops!')); + $unserializable_request = $request->reveal(); + + $this->requestStack->push($unserializable_request); + $this->requestStack->_serviceId = 'request_stack'; + + $container = $this->prophesize(ContainerInterface::class); + $container->get('request_stack')->willReturn($this->requestStack); + $container->has('request_stack')->willReturn(TRUE); + \Drupal::setContainer($container->reveal()); + + $store = unserialize(serialize($this->tempStore)); + $this->assertInstanceOf(SharedTempStore::class, $store); + + $request_stack = $this->getObjectAttribute($store, 'requestStack'); + $this->assertEquals($this->requestStack, $request_stack); + $this->assertSame($unserializable_request, $request_stack->pop()); + } + }