diff --git a/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php b/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php index 73c9513c16..a99d3ae700 100644 --- a/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php +++ b/src/Symfony/Component/Validator/Mapping/Cache/Psr6Cache.php @@ -70,6 +70,11 @@ class Psr6Cache implements CacheInterface */ private function escapeClassName($class) { + if (false !== strpos($class, '@')) { + // anonymous class: replace all PSR6-reserved characters + return str_replace(["\0", '\\', '/', '@', ':', '{', '}', '(', ')'], '.', $class); + } + return str_replace('\\', '.', $class); } } diff --git a/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php b/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php index c11dddbf6f..fcac5e232a 100644 --- a/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php +++ b/src/Symfony/Component/Validator/Tests/Mapping/Cache/Psr6CacheTest.php @@ -23,4 +23,12 @@ class Psr6CacheTest extends AbstractCacheTest $this->cache->write($metadata); $this->assertFalse($this->cache->has('Foo_Bar')); } + + public function testNameWithInvalidChars() + { + $metadata = new ClassMetadata('class@anonymous/path/file'); + + $this->cache->write($metadata); + $this->assertTrue($this->cache->has('class@anonymous/path/file')); + } }