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