-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathModelNormalizer.php
More file actions
99 lines (81 loc) · 2.55 KB
/
ModelNormalizer.php
File metadata and controls
99 lines (81 loc) · 2.55 KB
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
<?php
namespace App\Service;
use App\Controller\EntityController;
use Symfony\Component\PropertyAccess\PropertyAccessor;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
class ModelNormalizer
{
private $serializer;
public function normalize( $model, $relations = false, $dependents = false ): array
{
if ( ! is_object( $model ) ) {
return $this->getSerializer()->normalize( $model );
}
$entity = $model->getEntity();
$ref = ( is_callable( [ $model, 'getRef' ] ) ) ? $model->getRef() : '_';
$classRef = EntityController::getEntityReflection( $entity );
$propertyAccess = new PropertyAccessor();
$data = [
'_entity' => $classRef->getShortName(),
];
foreach ( $classRef->getProperties() as $property ) {
$name = $property->getName();
$getter = 'get' . ucfirst( $name );
if ( ! $relations ) {
$value = $propertyAccess->getValue( $entity, $name );
if ( is_object( $value ) ) {
if ( is_iterable( $value ) ) {
foreach ( $value as $key => $val ) {
$value[ $key ] = $val->getId();
}
} else {
$value = $value->getId();
}
}
} else {
if ( is_callable( [ $entity, $getter ] ) ) {
// Call Model method instead of entity to allow context overrides.
$value = call_user_func( [ $model, $getter ] );
} else {
$value = $propertyAccess->getValue( $entity, $name );
}
if ( is_iterable( $value ) ) {
foreach ( $value as $key => $val ) {
if ( is_object( $val ) && method_exists( $val, 'getEntity' ) ) {
$value[ $key ] = $val->getEntity();
}
}
} elseif ( is_object( $value ) && method_exists( $value, 'getEntity' ) ) {
$value = $value->getEntity();
}
}
$data[ $name ] = $value;
}
if ( $dependents ) {
// @todo Get dependents.
}
return $this->getSerializer()->normalize( $data );
}
public function getSerializer( $normalizers = [] ): Serializer
{
if ( $normalizers ) {
return new Serializer( $normalizers );
}
if ( $this->serializer instanceof Serializer ) {
return $this->serializer;
}
$this->serializer = new Serializer( [ $this->getNormalizer() ] );
return $this->serializer;
}
public function getNormalizer(): ObjectNormalizer
{
$defaultContext = [
AbstractNormalizer::CIRCULAR_REFERENCE_HANDLER => function ( object $object ): string {
return $object->getId();
},
];
return new ObjectNormalizer( null, null, null, null, null, null, $defaultContext );
}
}