From 3a4675359d7b0ec9636618519cfe26e07b22c64b Mon Sep 17 00:00:00 2001 From: Michael Zangerle Date: Tue, 25 Aug 2020 11:11:10 +0200 Subject: [PATCH] [Serializer] fixed fix encoding of cache keys with anonymous classes --- .../Factory/CacheClassMetadataFactory.php | 3 +-- .../Mapping/Factory/CacheMetadataFactoryTest.php | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php b/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php index 0b904c1440..081917c687 100644 --- a/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php +++ b/src/Symfony/Component/Serializer/Mapping/Factory/CacheClassMetadataFactory.php @@ -44,8 +44,7 @@ class CacheClassMetadataFactory implements ClassMetadataFactoryInterface public function getMetadataFor($value) { $class = $this->getClass($value); - // Key cannot contain backslashes according to PSR-6 - $key = strtr($class, '\\', '_'); + $key = rawurlencode(strtr($class, '\\', '_')); $item = $this->cacheItemPool->getItem($key); if ($item->isHit()) { diff --git a/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php b/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php index 723dc9b049..907311d435 100644 --- a/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php +++ b/src/Symfony/Component/Serializer/Tests/Mapping/Factory/CacheMetadataFactoryTest.php @@ -63,4 +63,20 @@ class CacheMetadataFactoryTest extends TestCase $factory->getMetadataFor('Not\Exist'); } + + public function testAnonymousClass() + { + $anonymousObject = new class() { + }; + + $metadata = new ClassMetadata(\get_class($anonymousObject)); + $decorated = $this->getMockBuilder(ClassMetadataFactoryInterface::class)->getMock(); + $decorated + ->expects($this->once()) + ->method('getMetadataFor') + ->willReturn($metadata); + + $factory = new CacheClassMetadataFactory($decorated, new ArrayAdapter()); + $this->assertEquals($metadata, $factory->getMetadataFor($anonymousObject)); + } }