19
19
use Symfony \Component \DependencyInjection \Reference ;
20
20
use Symfony \Component \Serializer \Debug \TraceableEncoder ;
21
21
use Symfony \Component \Serializer \Debug \TraceableNormalizer ;
22
+ use Symfony \Component \Serializer \Normalizer \ObjectNormalizer ;
22
23
use Symfony \Component \Serializer \SerializerInterface ;
23
24
24
25
/**
@@ -54,17 +55,27 @@ public function process(ContainerBuilder $container): void
54
55
throw new RuntimeException ('You must tag at least one service as "serializer.encoder" to use the "serializer" service. ' );
55
56
}
56
57
58
+ $ defaultContext = [];
57
59
if ($ container ->hasParameter ('serializer.default_context ' )) {
58
60
$ defaultContext = $ container ->getParameter ('serializer.default_context ' );
59
- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ defaultContext );
60
61
$ container ->getParameterBag ()->remove ('serializer.default_context ' );
61
62
$ container ->getDefinition ('serializer ' )->setArgument ('$defaultContext ' , $ defaultContext );
62
63
}
63
64
65
+ /** @var ?string $circularReferenceHandler */
66
+ $ circularReferenceHandler = $ container ->hasParameter ('.serializer.circular_reference_handler ' )
67
+ ? $ container ->getParameter ('.serializer.circular_reference_handler ' ) : null ;
68
+
69
+ /** @var ?string $maxDepthHandler */
70
+ $ maxDepthHandler = $ container ->hasParameter ('.serializer.max_depth_handler ' )
71
+ ? $ container ->getParameter ('.serializer.max_depth_handler ' ) : null ;
72
+
73
+ $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ defaultContext , $ circularReferenceHandler , $ maxDepthHandler );
74
+
64
75
$ this ->configureSerializer ($ container , 'serializer ' , $ normalizers , $ encoders , 'default ' );
65
76
66
77
if ($ namedSerializers ) {
67
- $ this ->configureNamedSerializers ($ container );
78
+ $ this ->configureNamedSerializers ($ container, $ circularReferenceHandler , $ maxDepthHandler );
68
79
}
69
80
}
70
81
@@ -98,11 +109,22 @@ private function createNamedSerializerTags(ContainerBuilder $container, string $
98
109
}
99
110
}
100
111
101
- private function bindDefaultContext (ContainerBuilder $ container , array $ services , array $ defaultContext ): void
112
+ private function bindDefaultContext (ContainerBuilder $ container , array $ services , array $ defaultContext, ? string $ circularReferenceHandler , ? string $ maxDepthHandler ): void
102
113
{
103
114
foreach ($ services as $ id ) {
104
115
$ definition = $ container ->getDefinition ((string ) $ id );
105
- $ definition ->setBindings (['array $defaultContext ' => new BoundArgument ($ defaultContext , false )] + $ definition ->getBindings ());
116
+
117
+ $ context = $ defaultContext ;
118
+ if (is_a ($ definition ->getClass (), ObjectNormalizer::class, true )) {
119
+ if (null !== $ circularReferenceHandler ) {
120
+ $ context += ['circular_reference_handler ' => new Reference ($ circularReferenceHandler )];
121
+ }
122
+ if (null !== $ maxDepthHandler ) {
123
+ $ context += ['max_depth_handler ' => new Reference ($ maxDepthHandler )];
124
+ }
125
+ }
126
+
127
+ $ definition ->setBindings (['array $defaultContext ' => new BoundArgument ($ context , false )] + $ definition ->getBindings ());
106
128
}
107
129
}
108
130
@@ -125,7 +147,7 @@ private function configureSerializer(ContainerBuilder $container, string $id, ar
125
147
$ serializerDefinition ->replaceArgument (1 , $ encoders );
126
148
}
127
149
128
- private function configureNamedSerializers (ContainerBuilder $ container ): void
150
+ private function configureNamedSerializers (ContainerBuilder $ container, ? string $ circularReferenceHandler , ? string $ maxDepthHandler ): void
129
151
{
130
152
$ defaultSerializerNameConverter = $ container ->hasParameter ('.serializer.name_converter ' )
131
153
? $ container ->getParameter ('.serializer.name_converter ' ) : null ;
@@ -149,7 +171,7 @@ private function configureNamedSerializers(ContainerBuilder $container): void
149
171
$ normalizers = $ this ->buildChildDefinitions ($ container , $ serializerName , $ normalizers , $ config );
150
172
$ encoders = $ this ->buildChildDefinitions ($ container , $ serializerName , $ encoders , $ config );
151
173
152
- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ]);
174
+ $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ], $ circularReferenceHandler , $ maxDepthHandler );
153
175
154
176
$ container ->registerChild ($ serializerId , 'serializer ' )->setArgument ('$defaultContext ' , $ config ['default_context ' ]);
155
177
$ container ->registerAliasForArgument ($ serializerId , SerializerInterface::class, $ serializerName .'.serializer ' );
@@ -184,7 +206,9 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri
184
206
foreach ($ services as &$ id ) {
185
207
$ childId = $ id .'. ' .$ serializerName ;
186
208
187
- $ definition = $ container ->registerChild ($ childId , (string ) $ id );
209
+ $ definition = $ container ->registerChild ($ childId , (string ) $ id )
210
+ ->setClass ($ container ->getDefinition ((string ) $ id )->getClass ())
211
+ ;
188
212
189
213
if (null !== $ nameConverterIndex = $ this ->findNameConverterIndex ($ container , (string ) $ id )) {
190
214
$ definition ->replaceArgument ($ nameConverterIndex , new Reference ($ config ['name_converter ' ]));
0 commit comments