Skip to content

Commit fbb53e5

Browse files
authored
fix(symfony): metadata aware name converter has 0 arguments by default (#6711)
Since symfony/symfony@ce228d3#diff-f53370286252d2326a377eafd4bba05112518e0c8bf3aedda670fd76a254e9fa the serializer.name_converter.metadata_aware is extending an abstract service. Therefore there are no arguments by default. We relied on the number of arguments to inject API Platform's configured name converter.
1 parent 3ca5991 commit fbb53e5

File tree

2 files changed

+29
-4
lines changed

2 files changed

+29
-4
lines changed

src/Symfony/Bundle/DependencyInjection/Compiler/MetadataAwareNameConverterPass.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,14 +39,20 @@ public function process(ContainerBuilder $container): void
3939
}
4040

4141
$definition = $container->getDefinition('serializer.name_converter.metadata_aware');
42-
$num = \count($definition->getArguments());
42+
$key = '$fallbackNameConverter';
43+
$arguments = $definition->getArguments();
44+
if (false === \array_key_exists($key, $arguments)) {
45+
$key = 1;
46+
}
4347

4448
if ($container->hasAlias('api_platform.name_converter')) {
4549
$nameConverter = new Reference((string) $container->getAlias('api_platform.name_converter'));
46-
if (1 === $num) {
50+
51+
// old symfony versions
52+
if (false === \array_key_exists($key, $arguments)) {
4753
$definition->addArgument($nameConverter);
48-
} elseif (1 < $num && null === $definition->getArgument(1)) {
49-
$definition->setArgument(1, $nameConverter);
54+
} elseif (null === $definition->getArgument($key)) {
55+
$definition->setArgument($key, $nameConverter);
5056
}
5157
}
5258

tests/Symfony/Bundle/DependencyInjection/Compiler/MetadataAwareNameConverterPassTest.php

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,23 @@ public function testProcessOnlyOneArg(): void
101101

102102
$pass->process($containerBuilderProphecy->reveal());
103103
}
104+
105+
public function testProcessWithAbstractMetadataAware(): void
106+
{
107+
$pass = new MetadataAwareNameConverterPass();
108+
109+
$definition = $this->prophesize(Definition::class);
110+
$definition->getArguments()->willReturn(['$metadataFactory' => [], '$fallbackNameConverter' => null])->shouldBeCalled();
111+
$definition->getArgument('$fallbackNameConverter')->willReturn(null)->shouldBeCalled();
112+
$definition->setArgument('$fallbackNameConverter', new Reference('app.name_converter'))->willReturn($definition)->shouldBeCalled();
113+
114+
$containerBuilderProphecy = $this->prophesize(ContainerBuilder::class);
115+
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->willReturn(true)->shouldBeCalled();
116+
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(true);
117+
$containerBuilderProphecy->getAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(new Alias('app.name_converter'));
118+
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldBeCalled();
119+
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->shouldBeCalled()->willReturn($definition);
120+
121+
$pass->process($containerBuilderProphecy->reveal());
122+
}
104123
}

0 commit comments

Comments
 (0)