Skip to content

Commit e0caeb7

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 e0caeb7

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-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: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,4 +637,34 @@ 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+
}
640670
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy