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)); + } }