2121use Symfony \Component \Serializer \Debug \TraceableNormalizer ;
2222use Symfony \Component \Serializer \Normalizer \DenormalizerInterface ;
2323use Symfony \Component \Serializer \Normalizer \NormalizerInterface ;
24+ use Symfony \Component \Serializer \Normalizer \ObjectNormalizer ;
2425use Symfony \Component \Serializer \SerializerInterface ;
2526
2627/**
@@ -56,17 +57,27 @@ public function process(ContainerBuilder $container): void
5657 throw new RuntimeException ('You must tag at least one service as "serializer.encoder" to use the "serializer" service. ' );
5758 }
5859
60+ $ defaultContext = [];
5961 if ($ container ->hasParameter ('serializer.default_context ' )) {
6062 $ defaultContext = $ container ->getParameter ('serializer.default_context ' );
61- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ defaultContext );
6263 $ container ->getParameterBag ()->remove ('serializer.default_context ' );
6364 $ container ->getDefinition ('serializer ' )->setArgument ('$defaultContext ' , $ defaultContext );
6465 }
6566
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+
6677 $ this ->configureSerializer ($ container , 'serializer ' , $ normalizers , $ encoders , 'default ' );
6778
6879 if ($ namedSerializers ) {
69- $ this ->configureNamedSerializers ($ container );
80+ $ this ->configureNamedSerializers ($ container, $ circularReferenceHandler , $ maxDepthHandler );
7081 }
7182 }
7283
@@ -100,11 +111,22 @@ private function createNamedSerializerTags(ContainerBuilder $container, string $
100111 }
101112 }
102113
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
104115 {
105116 foreach ($ services as $ id ) {
106117 $ 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 ());
108130 }
109131 }
110132
@@ -127,7 +149,7 @@ private function configureSerializer(ContainerBuilder $container, string $id, ar
127149 $ serializerDefinition ->replaceArgument (1 , $ encoders );
128150 }
129151
130- private function configureNamedSerializers (ContainerBuilder $ container ): void
152+ private function configureNamedSerializers (ContainerBuilder $ container, ? string $ circularReferenceHandler , ? string $ maxDepthHandler ): void
131153 {
132154 $ defaultSerializerNameConverter = $ container ->hasParameter ('.serializer.name_converter ' )
133155 ? $ container ->getParameter ('.serializer.name_converter ' ) : null ;
@@ -151,7 +173,7 @@ private function configureNamedSerializers(ContainerBuilder $container): void
151173 $ normalizers = $ this ->buildChildDefinitions ($ container , $ serializerName , $ normalizers , $ config );
152174 $ encoders = $ this ->buildChildDefinitions ($ container , $ serializerName , $ encoders , $ config );
153175
154- $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ]);
176+ $ this ->bindDefaultContext ($ container , array_merge ($ normalizers , $ encoders ), $ config ['default_context ' ], $ circularReferenceHandler , $ maxDepthHandler );
155177
156178 $ container ->registerChild ($ serializerId , 'serializer ' )->setArgument ('$defaultContext ' , $ config ['default_context ' ]);
157179 $ container ->registerAliasForArgument ($ serializerId , SerializerInterface::class, $ serializerName .'.serializer ' );
@@ -188,7 +210,9 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri
188210 foreach ($ services as &$ id ) {
189211 $ childId = $ id .'. ' .$ serializerName ;
190212
191- $ definition = $ container ->registerChild ($ childId , (string ) $ id );
213+ $ definition = $ container ->registerChild ($ childId , (string ) $ id )
214+ ->setClass ($ container ->getDefinition ((string ) $ id )->getClass ())
215+ ;
192216
193217 if (null !== $ nameConverterIndex = $ this ->findNameConverterIndex ($ container , (string ) $ id )) {
194218 $ definition ->replaceArgument ($ nameConverterIndex , new Reference ($ config ['name_converter ' ]));
0 commit comments