diff --git a/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php b/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php index bc1c6e10e3727..a82fbc4c9bd46 100644 --- a/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php +++ b/src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php @@ -185,8 +185,12 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri $definition = $container->registerChild($childId, (string) $id); - if (null !== $nameConverterIndex = $this->findNameConverterIndex($container, (string) $id)) { - $definition->replaceArgument($nameConverterIndex, new Reference($config['name_converter'])); + foreach ($container->getDefinition($id)->getArguments() as $index => $argument) { + if ($argument instanceof Reference && self::NAME_CONVERTER_METADATA_AWARE_ID === (string) $argument) { + $definition->replaceArgument($index, new Reference($config['name_converter'])); + } elseif ($argument instanceof Reference && str_starts_with((string) $argument, 'serializer.normalizer.')) { + $definition->replaceArgument($index, new Reference((string) $argument.'.'.$serializerName)); + } } $id = new Reference($childId); @@ -194,15 +198,4 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri return $services; } - - private function findNameConverterIndex(ContainerBuilder $container, string $id): int|string|null - { - foreach ($container->getDefinition($id)->getArguments() as $index => $argument) { - if ($argument instanceof Reference && self::NAME_CONVERTER_METADATA_AWARE_ID === (string) $argument) { - return $index; - } - } - - return null; - } } diff --git a/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php b/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php index b721b1ba48298..308e01d5d3fb9 100644 --- a/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php +++ b/src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php @@ -637,4 +637,34 @@ public function testNormalizersAndEncodersAreDecoratedAndOrderedWhenCollectingDa $this->assertEquals(new Reference('serializer.data_collector'), $traceableEncoderDefinition->getArgument(1)); $this->assertSame('api', $traceableEncoderDefinition->getArgument(2)); } + + public function testPropertyNormalizerIsCorrectInstanceWhenUsingNamedSerializer() + { + $container = new ContainerBuilder(); + + $container->setParameter('kernel.debug', false); + $container->setParameter('.serializer.named_serializers', [ + 'api' => [], + ]); + + $container->register('serializer')->setArguments([null, null]); + $container->register('n0') + ->setArguments([ + new Reference('serializer.normalizer.property'), + ]) + ->addTag('serializer.normalizer', ['serializer' => 'default']); + $container->register('n1') + ->setArguments([ + new Reference('serializer.normalizer.property'), + ]) + ->addTag('serializer.normalizer', ['serializer' => 'api']); + + $container->register('e1')->addTag('serializer.encoder', ['serializer' => ['*']]); + + $serializerPass = new SerializerPass(); + $serializerPass->process($container); + + $this->assertEquals(new Reference('serializer.normalizer.property'), $container->getDefinition('n0')->getArgument(0)); + $this->assertEquals(new Reference('serializer.normalizer.property.api'), $container->getDefinition('n1.api')->getArgument(0)); + } }