From 4b8f1007d56a47764057302c538241bc0b64b79f Mon Sep 17 00:00:00 2001 From: David Badura Date: Wed, 8 Apr 2026 16:02:52 +0200 Subject: [PATCH] add innerNormalizer methods & rename className methods --- src/Normalizer/ArrayNormalizer.php | 5 +++++ src/Normalizer/ArrayShapeNormalizer.php | 6 ++++++ src/Normalizer/EnumNormalizer.php | 12 ++++++++++-- src/Normalizer/ObjectNormalizer.php | 12 ++++++++++-- tests/Unit/Normalizer/ArrayNormalizerTest.php | 8 ++++++++ tests/Unit/Normalizer/ArrayShapeNormalizerTest.php | 8 ++++++++ tests/Unit/Normalizer/EnumNormalizerTest.php | 8 ++++---- tests/Unit/Normalizer/ObjectNormalizerTest.php | 12 ++++++------ 8 files changed, 57 insertions(+), 14 deletions(-) diff --git a/src/Normalizer/ArrayNormalizer.php b/src/Normalizer/ArrayNormalizer.php index b61d9b29..02b9f87e 100644 --- a/src/Normalizer/ArrayNormalizer.php +++ b/src/Normalizer/ArrayNormalizer.php @@ -101,4 +101,9 @@ public function handleType(Type|null $type): void $this->normalizer->handleType($type->getCollectionValueType()); } + + public function innerNormalizer(): Normalizer + { + return $this->normalizer; + } } diff --git a/src/Normalizer/ArrayShapeNormalizer.php b/src/Normalizer/ArrayShapeNormalizer.php index b86692f7..ef517b6a 100644 --- a/src/Normalizer/ArrayShapeNormalizer.php +++ b/src/Normalizer/ArrayShapeNormalizer.php @@ -120,4 +120,10 @@ public function handleType(Type|null $type): void $normalizer->handleType($shape[$field]['type']); } } + + /** @return array */ + public function innerNormalizers(): array + { + return $this->normalizerMap; + } } diff --git a/src/Normalizer/EnumNormalizer.php b/src/Normalizer/EnumNormalizer.php index 95bf1b63..af643d5d 100644 --- a/src/Normalizer/EnumNormalizer.php +++ b/src/Normalizer/EnumNormalizer.php @@ -6,6 +6,7 @@ use Attribute; use BackedEnum; +use Deprecated; use ReflectionType; use Symfony\Component\TypeInfo\Type; use Symfony\Component\TypeInfo\Type\BackedEnumType; @@ -30,7 +31,7 @@ public function normalize(mixed $value): mixed return null; } - $enum = $this->getEnum(); + $enum = $this->className(); if (!$value instanceof $enum) { throw InvalidArgument::withWrongType($enum . '|null', $value); @@ -49,7 +50,7 @@ public function denormalize(mixed $value): BackedEnum|null throw InvalidArgument::withWrongType('string|int|null', $value); } - $enum = $this->getEnum(); + $enum = $this->className(); try { return $enum::from($value); @@ -86,7 +87,14 @@ public function handleType(Type|null $type): void } /** @return class-string */ + #[Deprecated('Use `className()` method instead')] public function getEnum(): string + { + return $this->className(); + } + + /** @return class-string */ + public function className(): string { if ($this->enum === null) { throw InvalidType::missingType(); diff --git a/src/Normalizer/ObjectNormalizer.php b/src/Normalizer/ObjectNormalizer.php index 2aca4d7b..cfdc9a1e 100644 --- a/src/Normalizer/ObjectNormalizer.php +++ b/src/Normalizer/ObjectNormalizer.php @@ -5,6 +5,7 @@ namespace Patchlevel\Hydrator\Normalizer; use Attribute; +use Deprecated; use Patchlevel\Hydrator\Hydrator; use Patchlevel\Hydrator\HydratorWithContext; use ReflectionType; @@ -42,7 +43,7 @@ public function normalize(mixed $value, array $context = []): array|null return null; } - $className = $this->getClassName(); + $className = $this->className(); if (!$value instanceof $className) { throw InvalidArgument::withWrongType($className . '|null', $value); @@ -70,7 +71,7 @@ public function denormalize(mixed $value, array $context = []): object|null throw InvalidArgument::withWrongType('array|null', $value); } - $className = $this->getClassName(); + $className = $this->className(); if ($this->hydrator instanceof HydratorWithContext) { return $this->hydrator->hydrate($className, $value, $context); @@ -120,7 +121,14 @@ public function handleType(Type|null $type): void } /** @return class-string */ + #[Deprecated('Use `className()` method instead')] public function getClassName(): string + { + return $this->className(); + } + + /** @return class-string */ + public function className(): string { if ($this->className === null) { throw InvalidType::missingType(); diff --git a/tests/Unit/Normalizer/ArrayNormalizerTest.php b/tests/Unit/Normalizer/ArrayNormalizerTest.php index a617bfe3..88fa1cf0 100644 --- a/tests/Unit/Normalizer/ArrayNormalizerTest.php +++ b/tests/Unit/Normalizer/ArrayNormalizerTest.php @@ -161,4 +161,12 @@ public function testPassHydrator(): void $normalizer = new ArrayNormalizer($normalizer); $normalizer->setHydrator($hydrator); } + + public function testInnerNormalizer(): void + { + $innerNormalizer = $this->createMock(Normalizer::class); + $normalizer = new ArrayNormalizer($innerNormalizer); + + self::assertSame($innerNormalizer, $normalizer->innerNormalizer()); + } } diff --git a/tests/Unit/Normalizer/ArrayShapeNormalizerTest.php b/tests/Unit/Normalizer/ArrayShapeNormalizerTest.php index fc2369b3..a85a6e44 100644 --- a/tests/Unit/Normalizer/ArrayShapeNormalizerTest.php +++ b/tests/Unit/Normalizer/ArrayShapeNormalizerTest.php @@ -161,4 +161,12 @@ public function testPassHydrator(): void $normalizer = new ArrayShapeNormalizer(['foo' => $normalizer]); $normalizer->setHydrator($hydrator); } + + public function testInnerNormalizers(): void + { + $innerNormalizer = $this->createMock(Normalizer::class); + $normalizer = new ArrayShapeNormalizer(['foo' => $innerNormalizer]); + + self::assertSame(['foo' => $innerNormalizer], $normalizer->innerNormalizers()); + } } diff --git a/tests/Unit/Normalizer/EnumNormalizerTest.php b/tests/Unit/Normalizer/EnumNormalizerTest.php index dcaf1b50..cdb7e730 100644 --- a/tests/Unit/Normalizer/EnumNormalizerTest.php +++ b/tests/Unit/Normalizer/EnumNormalizerTest.php @@ -69,7 +69,7 @@ public function testAutoDetect(): void $normalizer = new EnumNormalizer(); $normalizer->handleReflectionType($this->reflectionType(AutoTypeDto::class, 'status')); - self::assertEquals(Status::class, $normalizer->getEnum()); + self::assertEquals(Status::class, $normalizer->className()); } public function testAutoDetectOverrideNotPossible(): void @@ -77,7 +77,7 @@ public function testAutoDetectOverrideNotPossible(): void $normalizer = new EnumNormalizer(AnotherEnum::class); $normalizer->handleReflectionType($this->reflectionType(AutoTypeDto::class, 'status')); - self::assertEquals(AnotherEnum::class, $normalizer->getEnum()); + self::assertEquals(AnotherEnum::class, $normalizer->className()); } public function testAutoDetectMissingType(): void @@ -85,7 +85,7 @@ public function testAutoDetectMissingType(): void $this->expectException(InvalidType::class); $normalizer = new EnumNormalizer(); - $normalizer->getEnum(); + $normalizer->className(); } public function testAutoDetectMissingTypeBecauseNull(): void @@ -95,7 +95,7 @@ public function testAutoDetectMissingTypeBecauseNull(): void $normalizer = new EnumNormalizer(); $normalizer->handleReflectionType(null); - $normalizer->getEnum(); + $normalizer->className(); } /** @param class-string $class */ diff --git a/tests/Unit/Normalizer/ObjectNormalizerTest.php b/tests/Unit/Normalizer/ObjectNormalizerTest.php index 2f53a153..c1ab8740 100644 --- a/tests/Unit/Normalizer/ObjectNormalizerTest.php +++ b/tests/Unit/Normalizer/ObjectNormalizerTest.php @@ -189,7 +189,7 @@ public function testAutoDetect(): void $normalizer->setHydrator($hydrator); $normalizer->handleReflectionType($this->reflectionType(AutoTypeDto::class, 'profileCreated')); - self::assertEquals(ProfileCreated::class, $normalizer->getClassName()); + self::assertEquals(ProfileCreated::class, $normalizer->className()); } public function testAutoDetectOverrideNotPossible(): void @@ -200,7 +200,7 @@ public function testAutoDetectOverrideNotPossible(): void $normalizer->setHydrator($hydrator); $normalizer->handleReflectionType($this->reflectionType(AutoTypeDto::class, 'profileCreated')); - self::assertEquals(AutoTypeDto::class, $normalizer->getClassName()); + self::assertEquals(AutoTypeDto::class, $normalizer->className()); } public function testAutoDetectMissingType(): void @@ -212,7 +212,7 @@ public function testAutoDetectMissingType(): void $normalizer = new ObjectNormalizer(); $normalizer->setHydrator($hydrator); - $normalizer->getClassName(); + $normalizer->className(); } public function testAutoDetectMissingTypeBecauseNull(): void @@ -225,7 +225,7 @@ public function testAutoDetectMissingTypeBecauseNull(): void $normalizer->setHydrator($hydrator); $normalizer->handleReflectionType(null); - $normalizer->getClassName(); + $normalizer->className(); } public function testGeneric(): void @@ -236,7 +236,7 @@ public function testGeneric(): void $normalizer->setHydrator($hydrator); $normalizer->handleType(Type::generic(Type::object(ProfileCreated::class))); - self::assertEquals(ProfileCreated::class, $normalizer->getClassName()); + self::assertEquals(ProfileCreated::class, $normalizer->className()); } public function testTemplate(): void @@ -247,7 +247,7 @@ public function testTemplate(): void $normalizer->setHydrator($hydrator); $normalizer->handleType(Type::template('T', Type::object(ProfileCreated::class))); - self::assertEquals(ProfileCreated::class, $normalizer->getClassName()); + self::assertEquals(ProfileCreated::class, $normalizer->className()); } public function testSerialize(): void