Skip to content

Commit ec410f9

Browse files
authored
Merge pull request #136 from patchlevel/require-context-in-normalizer
require context in normalizer
2 parents 93dd685 + 8d51ff1 commit ec410f9

20 files changed

Lines changed: 142 additions & 131 deletions

src/Middleware/TransformMiddleware.php

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
use Patchlevel\Hydrator\DenormalizationFailure;
99
use Patchlevel\Hydrator\Metadata\ClassMetadata;
1010
use Patchlevel\Hydrator\NormalizationFailure;
11-
use Patchlevel\Hydrator\Normalizer\ContextAwareNormalizer;
1211
use Patchlevel\Hydrator\TypeMismatch;
1312
use ReflectionParameter;
1413
use Throwable;
@@ -62,13 +61,8 @@ public function hydrate(ClassMetadata $metadata, array $data, array $context, St
6261

6362
if ($propertyMetadata->normalizer) {
6463
try {
65-
if ($propertyMetadata->normalizer instanceof ContextAwareNormalizer) {
66-
/** @psalm-suppress MixedAssignment */
67-
$value = $propertyMetadata->normalizer->denormalize($data[$propertyMetadata->fieldName], $context);
68-
} else {
69-
/** @psalm-suppress MixedAssignment */
70-
$value = $propertyMetadata->normalizer->denormalize($data[$propertyMetadata->fieldName]);
71-
}
64+
/** @psalm-suppress MixedAssignment */
65+
$value = $propertyMetadata->normalizer->denormalize($data[$propertyMetadata->fieldName], $context);
7266
} catch (Throwable $e) {
7367
throw new DenormalizationFailure(
7468
$metadata->className,
@@ -119,18 +113,11 @@ public function extract(ClassMetadata $metadata, object $object, array $context,
119113
foreach ($metadata->properties as $propertyMetadata) {
120114
if ($propertyMetadata->normalizer) {
121115
try {
122-
if ($propertyMetadata->normalizer instanceof ContextAwareNormalizer) {
123-
/** @psalm-suppress MixedAssignment */
124-
$data[$propertyMetadata->fieldName] = $propertyMetadata->normalizer->normalize(
125-
$propertyMetadata->getValue($object),
126-
$context,
127-
);
128-
} else {
129-
/** @psalm-suppress MixedAssignment */
130-
$data[$propertyMetadata->fieldName] = $propertyMetadata->normalizer->normalize(
131-
$propertyMetadata->getValue($object),
132-
);
133-
}
116+
/** @psalm-suppress MixedAssignment */
117+
$data[$propertyMetadata->fieldName] = $propertyMetadata->normalizer->normalize(
118+
$propertyMetadata->getValue($object),
119+
$context,
120+
);
134121
} catch (CircularReference $e) {
135122
throw $e;
136123
} catch (Throwable $e) {

src/Normalizer/ArrayNormalizer.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,12 @@ public function __construct(
2020
) {
2121
}
2222

23-
/** @return array<array-key, mixed>|null */
24-
public function normalize(mixed $value): array|null
23+
/**
24+
* @param array<string, mixed> $context
25+
*
26+
* @return array<array-key, mixed>|null
27+
*/
28+
public function normalize(mixed $value, array $context): array|null
2529
{
2630
if ($value === null) {
2731
return null;
@@ -32,14 +36,18 @@ public function normalize(mixed $value): array|null
3236
}
3337

3438
foreach ($value as &$item) {
35-
$item = $this->normalizer->normalize($item);
39+
$item = $this->normalizer->normalize($item, $context);
3640
}
3741

3842
return $value;
3943
}
4044

41-
/** @return array<array-key, mixed>|null */
42-
public function denormalize(mixed $value): array|null
45+
/**
46+
* @param array<string, mixed> $context
47+
*
48+
* @return array<array-key, mixed>|null
49+
*/
50+
public function denormalize(mixed $value, array $context): array|null
4351
{
4452
if ($value === null) {
4553
return null;
@@ -50,7 +58,7 @@ public function denormalize(mixed $value): array|null
5058
}
5159

5260
foreach ($value as &$item) {
53-
$item = $this->normalizer->denormalize($item);
61+
$item = $this->normalizer->denormalize($item, $context);
5462
}
5563

5664
return $value;

src/Normalizer/ArrayShapeNormalizer.php

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@ public function __construct(
2121
) {
2222
}
2323

24-
/** @return array<array-key, mixed>|null */
25-
public function normalize(mixed $value): array|null
24+
/**
25+
* @param array<string, mixed> $context
26+
*
27+
* @return array<array-key, mixed>|null
28+
*/
29+
public function normalize(mixed $value, array $context): array|null
2630
{
2731
if ($value === null) {
2832
return null;
@@ -39,14 +43,18 @@ public function normalize(mixed $value): array|null
3943
continue;
4044
}
4145

42-
$result[$field] = $normalizer->normalize($value[$field]);
46+
$result[$field] = $normalizer->normalize($value[$field], $context);
4347
}
4448

4549
return $result;
4650
}
4751

48-
/** @return array<array-key, mixed>|null */
49-
public function denormalize(mixed $value): array|null
52+
/**
53+
* @param array<string, mixed> $context
54+
*
55+
* @return array<array-key, mixed>|null
56+
*/
57+
public function denormalize(mixed $value, array $context): array|null
5058
{
5159
if ($value === null) {
5260
return null;
@@ -63,7 +71,7 @@ public function denormalize(mixed $value): array|null
6371
continue;
6472
}
6573

66-
$result[$field] = $normalizer->denormalize($value[$field]);
74+
$result[$field] = $normalizer->denormalize($value[$field], $context);
6775
}
6876

6977
return $result;

src/Normalizer/ContextAwareNormalizer.php

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/Normalizer/DateTimeImmutableNormalizer.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public function __construct(
1717
) {
1818
}
1919

20-
public function normalize(mixed $value): string|null
20+
/** @param array<string, mixed> $context */
21+
public function normalize(mixed $value, array $context): string|null
2122
{
2223
if ($value === null) {
2324
return null;
@@ -30,7 +31,8 @@ public function normalize(mixed $value): string|null
3031
return $value->format($this->format);
3132
}
3233

33-
public function denormalize(mixed $value): DateTimeImmutable|null
34+
/** @param array<string, mixed> $context */
35+
public function denormalize(mixed $value, array $context): DateTimeImmutable|null
3436
{
3537
if ($value === null) {
3638
return null;

src/Normalizer/DateTimeNormalizer.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ public function __construct(
1717
) {
1818
}
1919

20-
public function normalize(mixed $value): string|null
20+
/** @param array<string, mixed> $context */
21+
public function normalize(mixed $value, array $context): string|null
2122
{
2223
if ($value === null) {
2324
return null;
@@ -30,7 +31,8 @@ public function normalize(mixed $value): string|null
3031
return $value->format($this->format);
3132
}
3233

33-
public function denormalize(mixed $value): DateTime|null
34+
/** @param array<string, mixed> $context */
35+
public function denormalize(mixed $value, array $context): DateTime|null
3436
{
3537
if ($value === null) {
3638
return null;

src/Normalizer/DateTimeZoneNormalizer.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
#[Attribute(Attribute::TARGET_PROPERTY)]
1313
final class DateTimeZoneNormalizer implements Normalizer
1414
{
15-
public function normalize(mixed $value): string|null
15+
/** @param array<string, mixed> $context */
16+
public function normalize(mixed $value, array $context): string|null
1617
{
1718
if ($value === null) {
1819
return null;
@@ -25,7 +26,8 @@ public function normalize(mixed $value): string|null
2526
return $value->getName();
2627
}
2728

28-
public function denormalize(mixed $value): DateTimeZone|null
29+
/** @param array<string, mixed> $context */
30+
public function denormalize(mixed $value, array $context): DateTimeZone|null
2931
{
3032
if ($value === null) {
3133
return null;

src/Normalizer/EnumNormalizer.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@ public function __construct(
2323
) {
2424
}
2525

26-
public function normalize(mixed $value): mixed
26+
/** @param array<string, mixed> $context */
27+
public function normalize(mixed $value, array $context): mixed
2728
{
2829
if ($value === null) {
2930
return null;
@@ -38,7 +39,8 @@ public function normalize(mixed $value): mixed
3839
return $value->value;
3940
}
4041

41-
public function denormalize(mixed $value): BackedEnum|null
42+
/** @param array<string, mixed> $context */
43+
public function denormalize(mixed $value, array $context): BackedEnum|null
4244
{
4345
if ($value === null) {
4446
return null;

src/Normalizer/Normalizer.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,17 @@
66

77
interface Normalizer
88
{
9-
/** @throws InvalidArgument */
10-
public function normalize(mixed $value): mixed;
9+
/**
10+
* @param array<string, mixed> $context
11+
*
12+
* @throws InvalidArgument
13+
*/
14+
public function normalize(mixed $value, array $context): mixed;
1115

12-
/** @throws InvalidArgument */
13-
public function denormalize(mixed $value): mixed;
16+
/**
17+
* @param array<string, mixed> $context
18+
*
19+
* @throws InvalidArgument
20+
*/
21+
public function denormalize(mixed $value, array $context): mixed;
1422
}

src/Normalizer/ObjectNormalizer.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
use function is_array;
1616

1717
#[Attribute(Attribute::TARGET_PROPERTY | Attribute::TARGET_CLASS)]
18-
final class ObjectNormalizer implements ContextAwareNormalizer, TypeAwareNormalizer, HydratorAwareNormalizer
18+
final class ObjectNormalizer implements Normalizer, TypeAwareNormalizer, HydratorAwareNormalizer
1919
{
2020
private Hydrator|null $hydrator = null;
2121

@@ -30,7 +30,7 @@ public function __construct(
3030
*
3131
* @return array<string, mixed>|null
3232
*/
33-
public function normalize(mixed $value, array $context = []): array|null
33+
public function normalize(mixed $value, array $context): array|null
3434
{
3535
if (!$this->hydrator) {
3636
throw new MissingHydrator();
@@ -50,7 +50,7 @@ public function normalize(mixed $value, array $context = []): array|null
5050
}
5151

5252
/** @param array<string, mixed> $context */
53-
public function denormalize(mixed $value, array $context = []): object|null
53+
public function denormalize(mixed $value, array $context): object|null
5454
{
5555
if (!$this->hydrator) {
5656
throw new MissingHydrator();

0 commit comments

Comments
 (0)