From 8d3da317dee3449a9f8d3f6e47e0a6679530a31e Mon Sep 17 00:00:00 2001 From: JustDylan23 Date: Fri, 31 Dec 2021 21:24:03 +0100 Subject: [PATCH 1/3] ticket_44872 added unit test to reproduce #44872 --- .../Tests/Normalizer/ObjectNormalizerTest.php | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index f7aba27286233..1804b95d3af50 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -707,6 +707,17 @@ public function testDenomalizeRecursive() $this->assertSame(2, $obj->getInners()[1]->foo); } + public function testDenomalizeRecursiveWithObjectAttributeWithStringValue() + { + $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]); + $normalizer = new ObjectNormalizer(null, null, null, $extractor); + $serializer = new Serializer([new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer]); + + $this->expectException(UnexpectedValueException::class); + + $serializer->denormalize(['inner' => 'foo'], ObjectOuter::class); + } + public function testAcceptJsonNumber() { $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]); From e7412ad45863a52163410c94b5a24596453b7c2a Mon Sep 17 00:00:00 2001 From: JustDylan23 Date: Mon, 3 Jan 2022 17:06:02 +0100 Subject: [PATCH 2/3] ticket_44872 made the behavior of the recursive denormalizer the same as in Symfony 5 --- .../Component/Serializer/Normalizer/AbstractNormalizer.php | 2 +- .../Serializer/Tests/Normalizer/ObjectNormalizerTest.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php index b0a1f3218b830..7f86ed8d786e4 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php @@ -296,7 +296,7 @@ protected function isAllowedAttribute(object|string $classOrObject, string $attr * Normalizes the given data to an array. It's particularly useful during * the denormalization process. */ - protected function prepareForDenormalization(object|array|null $data): array + protected function prepareForDenormalization(mixed $data): array { return (array) $data; } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index 1804b95d3af50..ec3826f4ac147 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -713,9 +713,9 @@ public function testDenomalizeRecursiveWithObjectAttributeWithStringValue() $normalizer = new ObjectNormalizer(null, null, null, $extractor); $serializer = new Serializer([new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer]); - $this->expectException(UnexpectedValueException::class); + $obj = $serializer->denormalize(['inner' => 'foo'], ObjectOuter::class); - $serializer->denormalize(['inner' => 'foo'], ObjectOuter::class); + self::assertInstanceOf(ObjectInner::class, $obj->getInner()); } public function testAcceptJsonNumber() From e102f02e264cdaa4015441b26ea411ac47e5a423 Mon Sep 17 00:00:00 2001 From: JustDylan23 Date: Tue, 4 Jan 2022 22:17:25 +0100 Subject: [PATCH 3/3] ticket_44872 implemented PR feedback --- .../Tests/Normalizer/AbstractNormalizerTest.php | 12 ++++++++++++ .../Tests/Normalizer/ObjectNormalizerTest.php | 11 ----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php index 074e44e7adea8..5d7a42dba6b7a 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php @@ -5,6 +5,7 @@ use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor; +use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor; use Symfony\Component\Serializer\Encoder\JsonEncoder; use Symfony\Component\Serializer\Mapping\AttributeMetadata; use Symfony\Component\Serializer\Mapping\ClassMetadata; @@ -217,4 +218,15 @@ public function testIgnore() $this->assertSame([], $normalizer->normalize($dummy)); } + + public function testDenormalizeRecursiveWithObjectAttributeWithStringValue() + { + $extractor = new ReflectionExtractor(); + $normalizer = new ObjectNormalizer(null, null, null, $extractor); + $serializer = new Serializer([$normalizer]); + + $obj = $serializer->denormalize(['inner' => 'foo'], ObjectOuter::class); + + $this->assertInstanceOf(ObjectInner::class, $obj->getInner()); + } } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index ec3826f4ac147..f7aba27286233 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -707,17 +707,6 @@ public function testDenomalizeRecursive() $this->assertSame(2, $obj->getInners()[1]->foo); } - public function testDenomalizeRecursiveWithObjectAttributeWithStringValue() - { - $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]); - $normalizer = new ObjectNormalizer(null, null, null, $extractor); - $serializer = new Serializer([new ArrayDenormalizer(), new DateTimeNormalizer(), $normalizer]); - - $obj = $serializer->denormalize(['inner' => 'foo'], ObjectOuter::class); - - self::assertInstanceOf(ObjectInner::class, $obj->getInner()); - } - public function testAcceptJsonNumber() { $extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);