Prevent infinite loop in PropertyMetadata
This commit is contained in:
parent
ab6f181cb4
commit
c1ae7b6ad7
@ -58,8 +58,14 @@ class PropertyMetadata extends MemberMetadata
|
|||||||
*/
|
*/
|
||||||
protected function newReflectionMember($objectOrClassName)
|
protected function newReflectionMember($objectOrClassName)
|
||||||
{
|
{
|
||||||
|
$originalClass = is_string($objectOrClassName) ? $objectOrClassName : get_class($objectOrClassName);
|
||||||
|
|
||||||
while (!property_exists($objectOrClassName, $this->getName())) {
|
while (!property_exists($objectOrClassName, $this->getName())) {
|
||||||
$objectOrClassName = get_parent_class($objectOrClassName);
|
$objectOrClassName = get_parent_class($objectOrClassName);
|
||||||
|
|
||||||
|
if (false === $objectOrClassName) {
|
||||||
|
throw new ValidatorException(sprintf('Property "%s" does not exist in class "%s"', $this->getName(), $originalClass));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$member = new \ReflectionProperty($objectOrClassName, $this->getName());
|
$member = new \ReflectionProperty($objectOrClassName, $this->getName());
|
||||||
|
@ -42,4 +42,14 @@ class PropertyMetadataTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertTrue($metadata->isPublic($entity));
|
$this->assertTrue($metadata->isPublic($entity));
|
||||||
$this->assertEquals('Overridden data', $metadata->getPropertyValue($entity));
|
$this->assertEquals('Overridden data', $metadata->getPropertyValue($entity));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function testGetPropertyValueFromRemovedProperty()
|
||||||
|
{
|
||||||
|
$entity = new Entity('foobar');
|
||||||
|
$metadata = new PropertyMetadata(self::CLASSNAME, 'internal');
|
||||||
|
$metadata->name = 'test';
|
||||||
|
|
||||||
|
$this->setExpectedException('Symfony\Component\Validator\Exception\ValidatorException');
|
||||||
|
$metadata->getPropertyValue($entity);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user