8000 Named serializer should get correct normalizer instance · symfony/symfony@93ca946 · GitHub
[go: up one dir, main page]

Skip to content

Commit 93ca946

Browse files
committed
Named serializer should get correct normalizer instance
Named serializers were introduced in #56823 and they work great. We noticed a small bug when using custom name convertors. The MimeMessageNormalizer holds a reference to `serializer.normalizer.property`. But when using named serializers, it would use the specific child normalizer instead. With this change, we fix this problem for any service that starts with `serializer.normalizer.`.
1 parent c6bbff0 commit 93ca946

File tree

2 files changed

+37
-13
lines changed

2 files changed

+37
-13
lines changed

src/Symfony/Component/Serializer/DependencyInjection/SerializerPass.php

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -185,24 +185,17 @@ private function buildChildDefinitions(ContainerBuilder $container, string $seri
185185

186186
$definition = $container->registerChild($childId, (string) $id);
187187

188-
if (null !== $nameConverterIndex = $this->findNameConverterIndex($container, (string) $id)) {
189-
$definition->replaceArgument($nameConverterIndex, new Reference($config['name_converter']));
188+
foreach ($container->getDefinition($id)->getArguments() as $index => $argument) {
189+
if ($argument instanceof Reference && self::NAME_CONVERTER_METADATA_AWARE_ID === (string) $argument) {
190+
$definition->replaceArgument($index, new Reference($config['name_converter']));
191+
} elseif ($argument instanceof Reference && str_starts_with((string) $argument, 'serializer.normalizer.')) {
192+
$definition->replaceArgument($index, new Reference((string) $argument.'.'.$serializerName));
193+
}
190194
}
191195

192196
$id = new Reference($childId);
193197
}
194198

195199
return $services;
196200
}
197-
198-
private function findNameConverterIndex(ContainerBuilder $container, string $id): int|string|null
199-
{
200-
foreach ($container->getDefinition($id)->getArguments() as $index => $argument) {
201-
if ($argument instanceof Reference && self::NAME_CONVERTER_METADATA_AWARE_ID === (string) $argument) {
202-
return $index;
203-
}
204-
}
205-
206-
return null;
207-
}
208201
}

src/Symfony/Component/Serializer/Tests/DependencyInjection/SerializerPassTest.php

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,4 +637,35 @@ public function testNormalizersAndEncodersAreDecoratedAndOrderedWhenCollectingDa
637637
$this->assertEquals(new Reference('serializer.data_collector'), $traceableEncoderDefinition->getArgument(1));
638638
$this->assertSame('api', $traceableEncoderDefinition->getArgument(2));
639639
}
640+
641+
public function testPropertyNormalizerIsCorrectInstanceWhenUsingNamedSerializer()
642+
{
643+
$container = new ContainerBuilder();
644+
645+
$container->setParameter('kernel.debug', false);
646+
$container->setParameter('.serializer.named_serializers', [
647+
'api' => [],
648+
]);
649+
650+
$container->register('serializer')->setArguments([null, null]);
651+
$container->register('n0')
652+
->setArguments([
653+
new Reference('serializer.normalizer.property')
654+
])
655+
->addTag('serializer.normalizer', ['serializer' => 'default']);
656+
$container->register('n1')
657+
->setArguments([
658+
new Reference('serializer.normalizer.property')
659+
])
660+
->addTag('serializer.normalizer', ['serializer' => 'api']);
661+
662+
$container->register('e1')->addTag('serializer.encoder', ['serializer' => ['*']]);
663+
664+
$serializerPass = new SerializerPass();
665+
$serializerPass->process($container);
666+
667+
$this->assertEquals(new Reference('serializer.normalizer.property'), $container->getDefinition('n0')->getArgument(0));
668+
$this->assertEquals(new Reference('serializer.normalizer.property.api'), $container->getDefinition('n1.api')->getArgument(0));
669+
670+
}
640671
}

0 commit comments

Comments
 (0)
0