From 4187d3fdddc3b6299eb245c6614dce50321a28fe Mon Sep 17 00:00:00 2001 From: Alexandre Daubois Date: Fri, 8 Apr 2022 23:30:59 +0200 Subject: [PATCH] [Serializer][PropertyInfo] Fix support for "false" built-in type on PHP 8.2 --- .../Extractor/ReflectionExtractorTest.php | 15 +++++++++++++++ .../Tests/Fixtures/Php82Dummy.php | 19 +++++++++++++++++++ src/Symfony/Component/PropertyInfo/Type.php | 2 ++ .../Normalizer/AbstractObjectNormalizer.php | 2 +- .../Tests/Fixtures/FalseBuiltInDummy.php | 17 +++++++++++++++++ .../Serializer/Tests/SerializerTest.php | 14 ++++++++++++++ 6 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php create mode 100644 src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php diff --git a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php index 2f2449cd1112d..3f97527b720da 100644 --- a/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php +++ b/src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php @@ -272,6 +272,21 @@ public function php81TypesProvider() ]; } + /** + * @dataProvider php82TypesProvider + * @requires PHP 8.2 + */ + public function testExtractPhp82Type($property, array $type = null) + { + $this->assertEquals($type, $this->extractor->getTypes('Symfony\Component\PropertyInfo\Tests\Fixtures\Php82Dummy', $property, [])); + } + + public function php82TypesProvider() + { + yield ['nil', null]; + yield ['false', [new Type(Type::BUILTIN_TYPE_FALSE)]]; + } + /** * @dataProvider defaultValueProvider */ diff --git a/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php new file mode 100644 index 0000000000000..b830fabf8842a --- /dev/null +++ b/src/Symfony/Component/PropertyInfo/Tests/Fixtures/Php82Dummy.php @@ -0,0 +1,19 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\PropertyInfo\Tests\Fixtures; + +class Php82Dummy +{ + public null $nil = null; + + public false $false = false; +} diff --git a/src/Symfony/Component/PropertyInfo/Type.php b/src/Symfony/Component/PropertyInfo/Type.php index 582b98d6411f5..06f8fe6c64a55 100644 --- a/src/Symfony/Component/PropertyInfo/Type.php +++ b/src/Symfony/Component/PropertyInfo/Type.php @@ -28,6 +28,7 @@ class Type public const BUILTIN_TYPE_OBJECT = 'object'; public const BUILTIN_TYPE_ARRAY = 'array'; public const BUILTIN_TYPE_NULL = 'null'; + public const BUILTIN_TYPE_FALSE = 'false'; public const BUILTIN_TYPE_CALLABLE = 'callable'; public const BUILTIN_TYPE_ITERABLE = 'iterable'; @@ -45,6 +46,7 @@ class Type self::BUILTIN_TYPE_OBJECT, self::BUILTIN_TYPE_ARRAY, self::BUILTIN_TYPE_CALLABLE, + self::BUILTIN_TYPE_FALSE, self::BUILTIN_TYPE_NULL, self::BUILTIN_TYPE_ITERABLE, ]; diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index e29a7cd18e6b6..ec103f202bd0c 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -483,7 +483,7 @@ private function validateAndDenormalize(string $currentClass, string $attribute, return (float) $data; } - if (('is_'.$builtinType)($data)) { + if ('false' === $builtinType || ('is_'.$builtinType)($data)) { return $data; } } catch (NotNormalizableValueException $e) { diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php new file mode 100644 index 0000000000000..0c9d03a0e7298 --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/FalseBuiltInDummy.php @@ -0,0 +1,17 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Symfony\Component\Serializer\Tests\Fixtures; + +class FalseBuiltInDummy +{ + public false $false = false; +} diff --git a/src/Symfony/Component/Serializer/Tests/SerializerTest.php b/src/Symfony/Component/Serializer/Tests/SerializerTest.php index a95811a46f8d9..06eda94f53609 100644 --- a/src/Symfony/Component/Serializer/Tests/SerializerTest.php +++ b/src/Symfony/Component/Serializer/Tests/SerializerTest.php @@ -51,6 +51,7 @@ use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface; use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberOne; use Symfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberTwo; +use Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy; use Symfony\Component\Serializer\Tests\Fixtures\NormalizableTraversableDummy; use Symfony\Component\Serializer\Tests\Fixtures\TraversableDummy; use Symfony\Component\Serializer\Tests\Normalizer\TestDenormalizer; @@ -572,6 +573,19 @@ public function testUnionTypeDeserializable() $this->assertEquals(new DummyUnionType(), $actual, 'Union type denormalization third case failed.'); } + /** + * @requires PHP 8.2 + */ + public function testFalseBuiltInTypes() + { + $extractor = new PropertyInfoExtractor([], [new ReflectionExtractor()]); + $serializer = new Serializer([new ObjectNormalizer(null, null, null, $extractor)], ['json' => new JsonEncoder()]); + + $actual = $serializer->deserialize('{"false":false}', FalseBuiltInDummy::class, 'json'); + + $this->assertEquals(new FalseBuiltInDummy(), $actual); + } + private function serializerWithClassDiscriminator() { $classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));