From 4fe566bbc61a4be2cfed171442ae1733ec731a5f Mon Sep 17 00:00:00 2001 From: Nicolas Grekas Date: Mon, 26 Nov 2018 13:02:09 +0100 Subject: [PATCH] [PropertyAccess] make cache keys encoding bijective --- .../Component/PropertyAccess/PropertyAccessor.php | 11 +++++------ .../PropertyAccess/Tests/PropertyAccessorTest.php | 4 ++++ 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php index b4347c2009..90e4c234fb 100644 --- a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php +++ b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php @@ -508,14 +508,14 @@ class PropertyAccessor implements PropertyAccessorInterface */ private function getReadAccessInfo($class, $property) { - $key = false !== strpbrk($key = $class.'..'.$property, '{}()/@:') ? rawurlencode($key) : $key; + $key = str_replace('\\', '.', $class).'..'.$property; if (isset($this->readPropertyCache[$key])) { return $this->readPropertyCache[$key]; } if ($this->cacheItemPool) { - $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_READ.str_replace('\\', '.', $key)); + $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_READ.rawurlencode($key)); if ($item->isHit()) { return $this->readPropertyCache[$key] = $item->get(); } @@ -687,14 +687,14 @@ class PropertyAccessor implements PropertyAccessorInterface */ private function getWriteAccessInfo($class, $property, $value) { - $key = false !== strpbrk($key = $class.'..'.$property, '{}()/@:') ? rawurlencode($key) : $key; + $key = str_replace('\\', '.', $class).'..'.$property; if (isset($this->writePropertyCache[$key])) { return $this->writePropertyCache[$key]; } if ($this->cacheItemPool) { - $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_WRITE.str_replace('\\', '.', $key)); + $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_WRITE.rawurlencode($key)); if ($item->isHit()) { return $this->writePropertyCache[$key] = $item->get(); } @@ -868,8 +868,7 @@ class PropertyAccessor implements PropertyAccessorInterface } if ($this->cacheItemPool) { - $key = false !== strpbrk($propertyPath, '{}()/@:') ? rawurlencode($propertyPath) : $propertyPath; - $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_PROPERTY_PATH.str_replace('\\', '.', $key)); + $item = $this->cacheItemPool->getItem(self::CACHE_PREFIX_PROPERTY_PATH.rawurlencode($propertyPath)); if ($item->isHit()) { return $this->propertyPathCache[$propertyPath] = $item->get(); } diff --git a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php index 8536a6615e..cf6152380d 100644 --- a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php +++ b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php @@ -586,9 +586,13 @@ class PropertyAccessorTest extends TestCase { $obj = new \stdClass(); $obj->{'@foo'} = 'bar'; + $obj->{'a/b'} = '1'; + $obj->{'a%2Fb'} = '2'; $propertyAccessor = new PropertyAccessor(false, false, new ArrayAdapter()); $this->assertSame('bar', $propertyAccessor->getValue($obj, '@foo')); + $this->assertSame('1', $propertyAccessor->getValue($obj, 'a/b')); + $this->assertSame('2', $propertyAccessor->getValue($obj, 'a%2Fb')); } /**