From b27eb309d9a7af2df0ad9a441dee8d905a40925a Mon Sep 17 00:00:00 2001 From: Sergio Brighenti Date: Tue, 16 Jul 2024 11:19:28 +0200 Subject: [PATCH 1/2] support null for enum cast --- src/Hydrator.php | 4 +--- src/Resolver/EnumOrScalar.php | 5 +++-- .../ObjectWithStringableEnumNullableUnion.php | 11 +++++++++++ tests/HydratorTest.php | 14 ++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) create mode 100644 tests/Fixtures/ObjectWithStringableEnumNullableUnion.php diff --git a/src/Hydrator.php b/src/Hydrator.php index d57f439..5c76a7d 100644 --- a/src/Hydrator.php +++ b/src/Hydrator.php @@ -22,7 +22,6 @@ use SergiX44\Hydrator\Annotation\SkipConstructor; use SergiX44\Hydrator\Annotation\UnionResolver; use SergiX44\Hydrator\Exception\InvalidObjectException; - use function array_key_exists; use function class_exists; use function ctype_digit; @@ -38,7 +37,6 @@ use function is_subclass_of; use function sprintf; use function strtotime; - use const FILTER_NULL_ON_FAILURE; use const FILTER_VALIDATE_BOOLEAN; use const FILTER_VALIDATE_FLOAT; @@ -118,7 +116,7 @@ public function hydrate(string|object $object, array|object $data): object $propertyType = $resolver->resolve( $key, $propertyType->getTypes(), - is_array($data[$key]) ? $data[$key] : $data + isset($data[$key]) && is_array($data[$key]) ? $data[$key] : $data ); } else { throw new Exception\UnsupportedPropertyTypeException(sprintf( diff --git a/src/Resolver/EnumOrScalar.php b/src/Resolver/EnumOrScalar.php index 7bb2129..65df2bc 100644 --- a/src/Resolver/EnumOrScalar.php +++ b/src/Resolver/EnumOrScalar.php @@ -37,9 +37,10 @@ public function resolve(string $propertyName, array $propertyTypes, array $data) $valueType = gettype($value); $valueType = match ($valueType) { 'integer' => 'int', - 'double' => 'float', + 'double' => 'float', 'boolean' => 'bool', - default => $valueType, + 'NULL' => 'null', + default => $valueType, }; foreach ($propertyTypes as $t) { diff --git a/tests/Fixtures/ObjectWithStringableEnumNullableUnion.php b/tests/Fixtures/ObjectWithStringableEnumNullableUnion.php new file mode 100644 index 0000000..1c0cc05 --- /dev/null +++ b/tests/Fixtures/ObjectWithStringableEnumNullableUnion.php @@ -0,0 +1,11 @@ +assertSame(.23, $object->value); } + public function testHydrateStringableEnumUnionPropertyNull(): void + { + $object = (new Hydrator())->hydrate(Fixtures\ObjectWithStringableEnumNullableUnion::class, ['value' => null]); + + $this->assertNull($object->value); + } + + public function testHydrateStringableEnumUnionPropertyNullNonSet(): void + { + $object = (new Hydrator())->hydrate(Fixtures\ObjectWithStringableEnumNullableUnion::class, []); + + $this->assertNull($object->value); + } + public function testHydrateStringableEnumUnionPropertyBool(): void { $this->expectException(Exception\UnsupportedPropertyTypeException::class); From b2286248acbdf7b50de6c43a7c0c2b5367d0662d Mon Sep 17 00:00:00 2001 From: Sergio Brighenti Date: Tue, 16 Jul 2024 09:19:46 +0000 Subject: [PATCH 2/2] Apply fixes from StyleCI [ci skip] [skip ci] --- src/Hydrator.php | 2 ++ src/Resolver/EnumOrScalar.php | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Hydrator.php b/src/Hydrator.php index 5c76a7d..bc6d020 100644 --- a/src/Hydrator.php +++ b/src/Hydrator.php @@ -22,6 +22,7 @@ use SergiX44\Hydrator\Annotation\SkipConstructor; use SergiX44\Hydrator\Annotation\UnionResolver; use SergiX44\Hydrator\Exception\InvalidObjectException; + use function array_key_exists; use function class_exists; use function ctype_digit; @@ -37,6 +38,7 @@ use function is_subclass_of; use function sprintf; use function strtotime; + use const FILTER_NULL_ON_FAILURE; use const FILTER_VALIDATE_BOOLEAN; use const FILTER_VALIDATE_FLOAT; diff --git a/src/Resolver/EnumOrScalar.php b/src/Resolver/EnumOrScalar.php index 65df2bc..fad2170 100644 --- a/src/Resolver/EnumOrScalar.php +++ b/src/Resolver/EnumOrScalar.php @@ -37,10 +37,10 @@ public function resolve(string $propertyName, array $propertyTypes, array $data) $valueType = gettype($value); $valueType = match ($valueType) { 'integer' => 'int', - 'double' => 'float', + 'double' => 'float', 'boolean' => 'bool', - 'NULL' => 'null', - default => $valueType, + 'NULL' => 'null', + default => $valueType, }; foreach ($propertyTypes as $t) {