diff --git a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php index 9aaac706f2133..619500828d506 100644 --- a/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/GetSetMethodNormalizer.php @@ -107,7 +107,7 @@ private function isSetMethod(\ReflectionMethod $method): bool { return !$method->isStatic() && (\PHP_VERSION_ID < 80000 || !$method->getAttributes(Ignore::class)) - && 1 === $method->getNumberOfRequiredParameters() + && 0 < $method->getNumberOfParameters() && str_starts_with($method->name, 'set'); } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php index e7c23cf58a574..424dd215e7952 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/GetSetMethodNormalizerTest.php @@ -538,6 +538,18 @@ public function testSupportsAndDenormalizeWithOnlyParentSetter() $obj = $this->normalizer->denormalize(['foo' => 'foo'], GetSetDummyChild::class); $this->assertSame('foo', $obj->getFoo()); } + + /** + * @testWith [{"foo":"foo"}, "getFoo", "foo"] + * [{"bar":"bar"}, "getBar", "bar"] + */ + public function testSupportsAndDenormalizeWithOptionalSetterArgument(array $data, string $method, string $expected) + { + $this->assertTrue($this->normalizer->supportsDenormalization($data, GetSetDummyWithOptionalAndMultipleSetterArgs::class)); + + $obj = $this->normalizer->denormalize($data, GetSetDummyWithOptionalAndMultipleSetterArgs::class); + $this->assertSame($expected, $obj->$method()); + } } class GetSetDummy @@ -861,3 +873,29 @@ public function setFoo($foo) $this->foo = $foo; } } + +class GetSetDummyWithOptionalAndMultipleSetterArgs +{ + private $foo; + private $bar; + + public function getFoo() + { + return $this->foo; + } + + public function setFoo($foo = null) + { + $this->foo = $foo; + } + + public function getBar() + { + return $this->bar; + } + + public function setBar($bar = null, $other = true) + { + $this->bar = $bar; + } +}