-
Notifications
You must be signed in to change notification settings - Fork 0
/
ObjectNormalizer.php
101 lines (82 loc) · 2.91 KB
/
ObjectNormalizer.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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
<?php
namespace Vox\Serializer;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\NameConverter\NameConverterInterface;
use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
use Symfony\Component\Serializer\SerializerAwareInterface;
use Symfony\Component\Serializer\SerializerInterface;
/**
* this normalizer has the primary goal to aggregate the name converter functionality to the normalization
* its not optmized for performance though
*
* @author Jhonatan Teixeira <jhonatan.teixeira@gmail.com>
*/
class ObjectNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface
{
/**
* @var Normalizer
*/
private $normalizer;
/**
* @var Denormalizer
*/
private $denormalizer;
/**
* @var NameConverterInterface
*/
private $nameConverter;
/**
* @var SerializerInterface
*/
private $serializer;
public function __construct(
Normalizer $normalizer,
Denormalizer $denormalizer,
NameConverterInterface $nameConverter = null
) {
$this->normalizer = $normalizer;
$this->denormalizer = $denormalizer;
$this->nameConverter = $nameConverter ?? new CamelCaseToSnakeCaseNameConverter();
}
public function denormalize($data, $class, $format = null, array $context = array())
{
$data = $this->changeKeys($data, false);
return $this->denormalizer->denormalize($data, $class, $format, $context);
}
public function normalize($object, $format = null, array $context = array())
{
$data = $this->normalizer->normalize($object, $format, $context);
$this->normalizer->clear();
return $this->changeKeys($data, true);
}
private function changeKeys(array $array, bool $direction): array
{
$changed = [];
foreach ($array as $key => $value) {
if (is_array($value)) {
$value = $this->changeKeys($value, $direction);
}
if ($direction) {
$newKey = $this->nameConverter->normalize($key);
} else {
$newKey = $this->nameConverter->denormalize($key);
}
$changed[$newKey] = $value;
}
return $changed;
}
public function supportsDenormalization($data, $type, $format = null): bool
{
return $this->denormalizer->supportsDenormalization($data, $type, $format);
}
public function supportsNormalization($data, $format = null): bool
{
return $this->normalizer->supportsNormalization($data, $format);
}
public function setSerializer(SerializerInterface $serializer)
{
$this->serializer = $serializer;
$this->normalizer->setNormalizer($serializer);
}
}