generated from wayofdev/laravel-package-tpl
-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDefaultNormalizerRegistrationStrategy.php
62 lines (54 loc) · 2.98 KB
/
DefaultNormalizerRegistrationStrategy.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
<?php
declare(strict_types=1);
namespace WayOfDev\Serializer;
use Ramsey\Uuid\UuidInterface;
use Symfony\Component\PropertyInfo\Extractor\PhpDocExtractor;
use Symfony\Component\PropertyInfo\Extractor\ReflectionExtractor;
use Symfony\Component\PropertyInfo\PropertyInfoExtractor;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
use Symfony\Component\Serializer\Mapping\Loader\LoaderInterface;
use Symfony\Component\Serializer\NameConverter\MetadataAwareNameConverter;
use Symfony\Component\Serializer\Normalizer;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use WayOfDev\Serializer\Contracts\NormalizerRegistrationStrategy;
use WayOfDev\Serializer\Normalizers\RamseyUuidNormalizer;
use function interface_exists;
final readonly class DefaultNormalizerRegistrationStrategy implements NormalizerRegistrationStrategy
{
public function __construct(
private LoaderInterface $loader,
private bool $debugMode = false,
) {
}
/**
* @return iterable<array{normalizer: NormalizerInterface|DenormalizerInterface, priority: int<0, max>}>
*/
public function normalizers(): iterable
{
$factory = new ClassMetadataFactory($this->loader);
yield ['normalizer' => new Normalizer\UnwrappingDenormalizer(), 'priority' => 50];
yield ['normalizer' => new Normalizer\ProblemNormalizer(debug: $this->debugMode), 'priority' => 100];
yield ['normalizer' => new Normalizer\UidNormalizer(), 'priority' => 150];
yield ['normalizer' => new Normalizer\JsonSerializableNormalizer(), 'priority' => 200];
yield ['normalizer' => new Normalizer\DateTimeNormalizer(), 'priority' => 250];
yield ['normalizer' => new Normalizer\ConstraintViolationListNormalizer(), 'priority' => 300];
yield ['normalizer' => new Normalizer\MimeMessageNormalizer(new Normalizer\PropertyNormalizer()), 'priority' => 350];
yield ['normalizer' => new Normalizer\DateTimeZoneNormalizer(), 'priority' => 400];
yield ['normalizer' => new Normalizer\DateIntervalNormalizer(), 'priority' => 450];
yield ['normalizer' => new Normalizer\FormErrorNormalizer(), 'priority' => 500];
yield ['normalizer' => new Normalizer\BackedEnumNormalizer(), 'priority' => 550];
yield ['normalizer' => new Normalizer\DataUriNormalizer(), 'priority' => 600];
yield ['normalizer' => new Normalizer\ArrayDenormalizer(), 'priority' => 650];
yield ['normalizer' => new Normalizer\ObjectNormalizer(
classMetadataFactory: $factory,
nameConverter: new MetadataAwareNameConverter($factory),
propertyTypeExtractor: new PropertyInfoExtractor(
typeExtractors: [new PhpDocExtractor(), new ReflectionExtractor()]
)
), 'priority' => 700];
if (interface_exists(UuidInterface::class)) {
yield ['normalizer' => new RamseyUuidNormalizer(), 'priority' => 155];
}
}
}