1919use Symfony \Component \DependencyInjection \Reference ;
2020use Symfony \Component \Serializer \Debug \TraceableEncoder ;
2121use Symfony \Component \Serializer \Debug \TraceableNormalizer ;
22+ use Symfony \Component \Serializer \Normalizer \ObjectNormalizer ;
2223use Symfony \Component \Serializer \SerializerInterface ;
2324
2425/**
@@ -54,17 +55,27 @@ public function process(ContainerBuilder $container): void
5455 throw new RuntimeException ('You must tag at least one service as "serializer.encoder" to use the "serializer" service. ' );
5556 }
5657
58+ $ defaultContext = [];
5759 if ($ container ->hasParameter ('serializer.default_context ' )) {
5860 $ defaultContext = $ container ->getParameter ('serializer.default_context ' );
59- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ defaultContext );
6061 $ container ->getParameterBag ()->remove ('serializer.default_context ' );
6162 $ container ->getDefinition ('serializer ' )->setArgument ('$defaultContext ' , $ defaultContext );
6263 }
6364
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+
6475 $ this ->configureSerializer ($ container , 'serializer ' , $ normalizers , $ encoders , 'default ' );
6576
6677 if ($ namedSerializers ) {
67- $ this ->configureNamedSerializers ($ container );
78+ $ this ->configureNamedSerializers ($ container, $ circularReferenceHandler , $ maxDepthHandler );
6879 }
6980 }
7081
@@ -98,11 +109,22 @@ private function createNamedSerializerTags(ContainerBuilder $container, string $
98109 }
99110 }
100111
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
102113 {
103114 foreach ($ services as $ id ) {
104115 $ 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 ());
106128 }
107129 }
108130
@@ -125,7 +147,7 @@ private function configureSerializer(ContainerBuilder $container, string $id, ar
125147 $ serializerDefinition ->replaceArgument (1 , $ encoders );
126148 }
127149
128- private function configureNamedSerializers (ContainerBuilder $ container ): void
150+ private function configureNamedSerializers (ContainerBuilder $ container, ? string $ circularReferenceHandler , ? string $ maxDepthHandler ): void
129151 {
130152 $ defaultSerializerNameConverter = $ container ->hasParameter ('.serializer.name_converter ' )
131153 ? $ container ->getParameter ('.serializer.name_converter ' ) : null ;
@@ -149,7 +171,7 @@ private function configureNamedSerializers(ContainerBuilder $container): void
149171 $ normalizers = $ this ->buildChildDefinitions ($ container , $ serializerName , $ normalizers , $ config );
150172 $ encoders = $ this ->buildChildDefinitions ($ container , $ serializerName , $ encoders , $ config );
151173
152- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ]);
174+ $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ], $ circularReferenceHandler , $ maxDepthHandler );
153175
154176 $ container ->registerChild ($ serializerId , 'serializer ' )->setArgument ('$defaultContext ' , $ config ['default_context ' ]);
155177 $ container ->registerAliasForArgument ($ serializerId , SerializerInterface::class, $ serializerName .'.serializer ' );
@@ -184,7 +206,9 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri
184206 foreach ($ services as &$ id ) {
185207 $ childId = $ id .'. ' .$ serializerName ;
186208
187- $ definition = $ container ->registerChild ($ childId , (string ) $ id );
209+ $ definition = $ container ->registerChild ($ childId , (string ) $ id )
210+ ->setClass ($ container ->getDefinition ((string ) $ id )->getClass ())
211+ ;
188212
189213 if (null !== $ nameConverterIndex = $ this ->findNameConverterIndex ($ container , (string ) $ id )) {
190214 $ definition ->replaceArgument ($ nameConverterIndex , new Reference ($ config ['name_converter ' ]));
0 commit comments