diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php index 4de4771770..93dfba9a39 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php @@ -291,7 +291,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N * * @throws RuntimeException */ - protected function instantiateObject(array $data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes) + protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes) { if ( isset($context['object_to_populate']) && diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php index de4c3ece1d..44a71cf1b4 100644 --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php @@ -102,6 +102,7 @@ class GetSetMethodNormalizer extends AbstractNormalizer $reflectionClass = new \ReflectionClass($class); $object = $this->instantiateObject($normalizedData, $class, $context, $reflectionClass, $allowedAttributes); + $classMethods = get_class_methods($object); foreach ($normalizedData as $attribute => $value) { if ($this->nameConverter) { $attribute = $this->nameConverter->denormalize($attribute); @@ -113,7 +114,7 @@ class GetSetMethodNormalizer extends AbstractNormalizer if ($allowed && !$ignored) { $setter = 'set'.ucfirst($attribute); - if (method_exists($object, $setter)) { + if (in_array($setter, $classMethods)) { $object->$setter($value); } } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php index 92051863d5..32d729a211 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php @@ -228,6 +228,12 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase $this->assertEquals('bar', $obj->getBar()); } + public function testConstructorWArgWithPrivateMutator() + { + $obj = $this->normalizer->denormalize(array('foo' => 'bar'), __NAMESPACE__.'\ObjectConstructorArgsWithPrivateMutatorDummy', 'any'); + $this->assertEquals('bar', $obj->getFoo()); + } + public function testGroupsNormalize() { $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader())); @@ -511,8 +517,8 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase public function testDenormalizeNonExistingAttribute() { $this->assertEquals( - new PropertyDummy(), - $this->normalizer->denormalize(array('non_existing' => true), __NAMESPACE__.'\PropertyDummy') + new GetSetDummy(), + $this->normalizer->denormalize(array('non_existing' => true), __NAMESPACE__.'\GetSetDummy') ); } @@ -520,6 +526,12 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase { $this->assertFalse($this->normalizer->supportsNormalization(new \ArrayObject())); } + + public function testPrivateSetter() + { + $obj = $this->normalizer->denormalize(array('foo' => 'foobar'), __NAMESPACE__.'\ObjectWithPrivateSetterDummy'); + $this->assertEquals('bar', $obj->getFoo()); + } } class GetSetDummy @@ -726,3 +738,37 @@ class GetCamelizedDummy return $this->bar_foo; } } + +class ObjectConstructorArgsWithPrivateMutatorDummy +{ + private $foo; + + public function __construct($foo) + { + $this->setFoo($foo); + } + + public function getFoo() + { + return $this->foo; + } + + private function setFoo($foo) + { + $this->foo = $foo; + } +} + +class ObjectWithPrivateSetterDummy +{ + private $foo = 'bar'; + + public function getFoo() + { + return $this->foo; + } + + private function setFoo($foo) + { + } +}