diff --git a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php index b7333dac30..db9c6b8465 100644 --- a/src/Symfony/Component/PropertyAccess/PropertyAccessor.php +++ b/src/Symfony/Component/PropertyAccess/PropertyAccessor.php @@ -455,6 +455,7 @@ class PropertyAccessor implements PropertyAccessorInterface $getsetter = lcfirst($camelProp); // jQuery style, e.g. read: last(), write: last($item) $isser = 'is'.$camelProp; $hasser = 'has'.$camelProp; + $canAccessor = 'can'.$camelProp; if ($reflClass->hasMethod($getter) && $reflClass->getMethod($getter)->isPublic()) { $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD; @@ -468,6 +469,9 @@ class PropertyAccessor implements PropertyAccessorInterface } elseif ($reflClass->hasMethod($hasser) && $reflClass->getMethod($hasser)->isPublic()) { $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD; $access[self::ACCESS_NAME] = $hasser; + } elseif ($reflClass->hasMethod($canAccessor) && $reflClass->getMethod($canAccessor)->isPublic()) { + $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_METHOD; + $access[self::ACCESS_NAME] = $canAccessor; } elseif ($reflClass->hasMethod('__get') && $reflClass->getMethod('__get')->isPublic()) { $access[self::ACCESS_TYPE] = self::ACCESS_TYPE_PROPERTY; $access[self::ACCESS_NAME] = $property; diff --git a/src/Symfony/Component/PropertyAccess/Tests/Fixtures/TestClass.php b/src/Symfony/Component/PropertyAccess/Tests/Fixtures/TestClass.php index e63af3a8ba..a667997a9b 100644 --- a/src/Symfony/Component/PropertyAccess/Tests/Fixtures/TestClass.php +++ b/src/Symfony/Component/PropertyAccess/Tests/Fixtures/TestClass.php @@ -25,6 +25,7 @@ class TestClass private $publicAccessorWithMoreRequiredParameters; private $publicIsAccessor; private $publicHasAccessor; + private $publicCanAccessor; private $publicGetter; private $date; @@ -39,6 +40,7 @@ class TestClass $this->publicAccessorWithMoreRequiredParameters = $value; $this->publicIsAccessor = $value; $this->publicHasAccessor = $value; + $this->publicCanAccessor = $value; $this->publicGetter = $value; } @@ -102,6 +104,16 @@ class TestClass return $this->publicHasAccessor; } + public function setPublicCanAccessor($value) + { + $this->publicCanAccessor = $value; + } + + public function canPublicCanAccessor() + { + return $this->publicCanAccessor; + } + public function publicGetSetter($value = null) { if (null !== $value) { diff --git a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php index 5151489eb0..2a7dd8a831 100644 --- a/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php +++ b/src/Symfony/Component/PropertyAccess/Tests/PropertyAccessorTest.php @@ -450,6 +450,7 @@ class PropertyAccessorTest extends TestCase [new TestClass('Bernhard'), 'publicIsAccessor', 'Bernhard'], [new TestClass('Bernhard'), 'publicHasAccessor', 'Bernhard'], [new TestClass('Bernhard'), 'publicGetSetter', 'Bernhard'], + [new TestClass('Bernhard'), 'publicCanAccessor', 'Bernhard'], // Methods are camelized [new TestClass('Bernhard'), 'public_accessor', 'Bernhard'],