From 1345360e3f8f1fb6affb160d48616ebe483417ba Mon Sep 17 00:00:00 2001 From: Bernhard Schussek Date: Mon, 9 Jul 2012 18:21:55 +0200 Subject: [PATCH] [Form] Fixed PropertyPath handling of offsetGet() that returns a constant value --- .../Tests/Util/PropertyPathCollectionTest.php | 39 ++++++++++++++++++ .../Form/Tests/Util/PropertyPathTest.php | 40 ------------------- .../Component/Form/Util/PropertyPath.php | 8 +++- 3 files changed, 46 insertions(+), 41 deletions(-) diff --git a/src/Symfony/Component/Form/Tests/Util/PropertyPathCollectionTest.php b/src/Symfony/Component/Form/Tests/Util/PropertyPathCollectionTest.php index 3798d252450f..a52a42911ab9 100644 --- a/src/Symfony/Component/Form/Tests/Util/PropertyPathCollectionTest.php +++ b/src/Symfony/Component/Form/Tests/Util/PropertyPathCollectionTest.php @@ -96,6 +96,45 @@ abstract class PropertyPathCollectionTest extends \PHPUnit_Framework_TestCase { abstract protected function getCollection(array $array); + public function testGetValueReadsArrayAccess() + { + $object = $this->getCollection(array('firstName' => 'Bernhard')); + + $path = new PropertyPath('[firstName]'); + + $this->assertEquals('Bernhard', $path->getValue($object)); + } + + /** + * @expectedException Symfony\Component\Form\Exception\InvalidPropertyException + */ + public function testGetValueThrowsExceptionIfArrayAccessExpected() + { + $path = new PropertyPath('[firstName]'); + + $path->getValue(new \stdClass()); + } + + public function testSetValueUpdatesArrayAccess() + { + $object = $this->getCollection(array()); + + $path = new PropertyPath('[firstName]'); + $path->setValue($object, 'Bernhard'); + + $this->assertEquals('Bernhard', $object['firstName']); + } + + /** + * @expectedException Symfony\Component\Form\Exception\InvalidPropertyException + */ + public function testSetValueThrowsExceptionIfArrayAccessExpected() + { + $path = new PropertyPath('[firstName]'); + + $path->setValue(new \stdClass(), 'Bernhard'); + } + public function testSetValueCallsAdderAndRemoverForCollections() { $axesBefore = $this->getCollection(array(1 => 'second', 3 => 'fourth', 4 => 'fifth')); diff --git a/src/Symfony/Component/Form/Tests/Util/PropertyPathTest.php b/src/Symfony/Component/Form/Tests/Util/PropertyPathTest.php index b1830addd5a3..c2ffb4dfc55c 100644 --- a/src/Symfony/Component/Form/Tests/Util/PropertyPathTest.php +++ b/src/Symfony/Component/Form/Tests/Util/PropertyPathTest.php @@ -123,26 +123,6 @@ public function testGetValueReadsPropertyWithCustomPropertyPath() $this->assertEquals('Bernhard', $path->getValue($object)); } - public function testGetValueReadsArrayAccess() - { - $object = new \ArrayObject(); - $object['firstName'] = 'Bernhard'; - - $path = new PropertyPath('[firstName]'); - - $this->assertEquals('Bernhard', $path->getValue($object)); - } - - /** - * @expectedException Symfony\Component\Form\Exception\InvalidPropertyException - */ - public function testGetValueThrowsExceptionIfArrayAccessExpected() - { - $path = new PropertyPath('[firstName]'); - - $path->getValue(new Author()); - } - /** * @expectedException Symfony\Component\Form\Exception\PropertyAccessDeniedException */ @@ -328,16 +308,6 @@ public function testSetValueUpdatesPropertiesWithCustomPropertyPath() $this->assertEquals('Bernhard', $object->child['index']->firstName); } - public function testSetValueUpdatesArrayAccess() - { - $object = new \ArrayObject(); - - $path = new PropertyPath('[firstName]'); - $path->setValue($object, 'Bernhard'); - - $this->assertEquals('Bernhard', $object['firstName']); - } - public function testSetValueUpdateMagicSet() { $object = new Magician(); @@ -348,16 +318,6 @@ public function testSetValueUpdateMagicSet() $this->assertEquals('foobar', $object->__get('magicProperty')); } - /** - * @expectedException Symfony\Component\Form\Exception\InvalidPropertyException - */ - public function testSetValueThrowsExceptionIfArrayAccessExpected() - { - $path = new PropertyPath('[firstName]'); - - $path->setValue(new Author(), 'Bernhard'); - } - public function testSetValueUpdatesSetters() { $object = new Author(); diff --git a/src/Symfony/Component/Form/Util/PropertyPath.php b/src/Symfony/Component/Form/Util/PropertyPath.php index 81b2242bb998..0dff6f97db0d 100644 --- a/src/Symfony/Component/Form/Util/PropertyPath.php +++ b/src/Symfony/Component/Form/Util/PropertyPath.php @@ -365,6 +365,8 @@ protected function &readPropertyAt(&$objectOrArray, $index) */ protected function &readProperty(&$objectOrArray, $property, $isIndex) { + // The local variable (instead of immediate returns) is necessary + // because we want to return by reference! $result = null; if ($isIndex) { @@ -373,7 +375,11 @@ protected function &readProperty(&$objectOrArray, $property, $isIndex) } if (isset($objectOrArray[$property])) { - $result =& $objectOrArray[$property]; + if (is_array($objectOrArray)) { + $result =& $objectOrArray[$property]; + } else { + $result = $objectOrArray[$property]; + } } } elseif (is_object($objectOrArray)) { $camelProp = $this->camelize($property);