From bdf470700c4f2b948eedf8e0f06f63d395345ce4 Mon Sep 17 00:00:00 2001 From: David Badura Date: Wed, 19 Nov 2025 17:57:57 +0100 Subject: [PATCH] add inline normalizer --- src/Normalizer/InlineNormalizer.php | 41 +++++++++++++++++++ .../ProfileCreatedWithInlineNormalizer.php | 25 +++++++++++ tests/Unit/MetadataHydratorTest.php | 33 ++++++++++++++- 3 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/Normalizer/InlineNormalizer.php create mode 100644 tests/Unit/Fixture/ProfileCreatedWithInlineNormalizer.php diff --git a/src/Normalizer/InlineNormalizer.php b/src/Normalizer/InlineNormalizer.php new file mode 100644 index 0000000..364925a --- /dev/null +++ b/src/Normalizer/InlineNormalizer.php @@ -0,0 +1,41 @@ +passNull && $value === null) { + return null; + } + + return ($this->normalize)($value); + } + + public function denormalize(mixed $value): mixed + { + if (!$this->passNull && $value === null) { + return null; + } + + return ($this->denormalize)($value); + } +} diff --git a/tests/Unit/Fixture/ProfileCreatedWithInlineNormalizer.php b/tests/Unit/Fixture/ProfileCreatedWithInlineNormalizer.php new file mode 100644 index 0000000..96299fe --- /dev/null +++ b/tests/Unit/Fixture/ProfileCreatedWithInlineNormalizer.php @@ -0,0 +1,25 @@ +toString(); + }, + denormalize: static function (string $value): Email { + return Email::fromString($value); + }, + )] + public Email $email, + ) { + } +} diff --git a/tests/Unit/MetadataHydratorTest.php b/tests/Unit/MetadataHydratorTest.php index c5efaa9..cba242b 100644 --- a/tests/Unit/MetadataHydratorTest.php +++ b/tests/Unit/MetadataHydratorTest.php @@ -33,6 +33,7 @@ use Patchlevel\Hydrator\Tests\Unit\Fixture\NormalizerInBaseClassDefinedDto; use Patchlevel\Hydrator\Tests\Unit\Fixture\ParentDto; use Patchlevel\Hydrator\Tests\Unit\Fixture\ProfileCreated; +use Patchlevel\Hydrator\Tests\Unit\Fixture\ProfileCreatedWithInlineNormalizer; use Patchlevel\Hydrator\Tests\Unit\Fixture\ProfileCreatedWithNormalizer; use Patchlevel\Hydrator\Tests\Unit\Fixture\ProfileCreatedWrapper; use Patchlevel\Hydrator\Tests\Unit\Fixture\ProfileId; @@ -113,7 +114,7 @@ public function testExtractCircularReference(): void $this->hydrator->extract($dto1); } - public function testExtractWithInferNormalizer2(): void + public function testExtractWithInferNormalizer(): void { $result = $this->hydrator->extract( new InferNormalizerWithNullableDto( @@ -148,6 +149,20 @@ public function testExtractWithInferNormalizerFailed(): void ); } + #[RequiresPhp('>=8.5')] + public function testExtractWithInlineNormalizer(): void + { + $event = new ProfileCreatedWithInlineNormalizer( + ProfileId::fromString('1'), + Email::fromString('info@patchlevel.de'), + ); + + self::assertEquals( + ['profileId' => '1', 'email' => 'info@patchlevel.de'], + $this->hydrator->extract($event), + ); + } + public function testExtractWithHooks(): void { $data = $this->hydrator->extract(new DtoWithHooks()); @@ -236,6 +251,22 @@ public function testHydrateWithTypeMismatch(): void ); } + #[RequiresPhp('>=8.5')] + public function testHydrateWithInlineNormalizer(): void + { + $expected = new ProfileCreatedWithInlineNormalizer( + ProfileId::fromString('1'), + Email::fromString('info@patchlevel.de'), + ); + + $event = $this->hydrator->hydrate( + ProfileCreatedWithInlineNormalizer::class, + ['profileId' => '1', 'email' => 'info@patchlevel.de'], + ); + + self::assertEquals($expected, $event); + } + public function testDenormalizationFailure(): void { $this->expectException(DenormalizationFailure::class);