Skip to content

Commit f8bd599

Browse files
committed
Use the metadata aware name converter when available fix #2677
1 parent 9222ded commit f8bd599

File tree

2 files changed

+36
-22
lines changed

2 files changed

+36
-22
lines changed

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

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use ApiPlatform\Core\Exception\RuntimeException;
1717
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1818
use Symfony\Component\DependencyInjection\ContainerBuilder;
19+
use Symfony\Component\DependencyInjection\Reference;
1920

2021
/**
2122
* Injects the metadata aware name converter if available.
@@ -33,14 +34,20 @@ final class MetadataAwareNameConverterPass implements CompilerPassInterface
3334
*/
3435
public function process(ContainerBuilder $container)
3536
{
36-
if ($container->hasAlias('api_platform.name_converter') || !$container->hasDefinition('serializer.name_converter.metadata_aware')) {
37+
if (!$container->hasDefinition('serializer.name_converter.metadata_aware')) {
3738
return;
3839
}
3940

4041
$definition = $container->getDefinition('serializer.name_converter.metadata_aware');
41-
42-
if (1 >= \count($definition->getArguments()) || null === $definition->getArgument(1)) {
43-
return;
42+
$num = \count($definition->getArguments());
43+
44+
if ($container->hasAlias('api_platform.name_converter')) {
45+
$nameConverter = new Reference((string) $container->getAlias('api_platform.name_converter'));
46+
if (1 === $num) {
47+
$definition->addArgument($nameConverter);
48+
} elseif (1 < $num && null === $definition->getArgument(1)) {
49+
$definition->setArgument(1, $nameConverter);
50+
}
4451
}
4552

4653
$container->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware');

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

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
use ApiPlatform\Core\Bridge\Symfony\Bundle\DependencyInjection\Compiler\MetadataAwareNameConverterPass;
1717
use PHPUnit\Framework\TestCase;
18+
use Prophecy\Argument;
19+
use Symfony\Component\DependencyInjection\Alias;
1820
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1921
use Symfony\Component\DependencyInjection\ContainerBuilder;
2022
use Symfony\Component\DependencyInjection\Definition;
@@ -30,18 +32,17 @@ public function testConstruct()
3032
$this->assertInstanceOf(CompilerPassInterface::class, new MetadataAwareNameConverterPass());
3133
}
3234

33-
public function testProcess()
35+
public function testProcessFirstArgumentConfigured()
3436
{
3537
$pass = new MetadataAwareNameConverterPass();
3638

37-
$arguments = [new Reference('serializer.mapping.class_metadata_factory'), new Reference('app.name_converter')];
38-
3939
$definition = $this->prophesize(Definition::class);
40-
$definition->getArguments()->willReturn($arguments)->shouldBeCalled();
41-
$definition->getArgument(1)->willReturn($arguments[1])->shouldBeCalled();
40+
$definition->getArguments()->willReturn([0, 1])->shouldBeCalled();
41+
$definition->getArgument(1)->willReturn(new Reference('app.name_converter'))->shouldBeCalled();
4242

4343
$containerBuilderProphecy = $this->prophesize(ContainerBuilder::class);
44-
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->willReturn(false)->shouldBeCalled();
44+
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(true);
45+
$containerBuilderProphecy->getAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(Argument::any());
4546
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->willReturn(true)->shouldBeCalled();
4647
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->willReturn($definition)->shouldBeCalled();
4748
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldBeCalled();
@@ -53,11 +54,19 @@ public function testProcessWithNameConverter()
5354
{
5455
$pass = new MetadataAwareNameConverterPass();
5556

57+
$reference = new Reference('app.name_converter');
58+
59+
$definition = $this->prophesize(Definition::class);
60+
$definition->getArguments()->willReturn([0, 1])->shouldBeCalled();
61+
$definition->getArgument(1)->willReturn(null)->shouldBeCalled();
62+
$definition->setArgument(1, $reference)->shouldBeCalled();
63+
5664
$containerBuilderProphecy = $this->prophesize(ContainerBuilder::class);
5765
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->willReturn(true)->shouldBeCalled();
58-
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->shouldNotBeCalled();
59-
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->shouldNotBeCalled();
60-
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldNotBeCalled();
66+
$containerBuilderProphecy->getAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(new Alias('app.name_converter'));
67+
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->shouldBeCalled()->willReturn(true);
68+
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->shouldBeCalled()->willReturn($definition);
69+
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldBeCalled();
6170

6271
$pass->process($containerBuilderProphecy->reveal());
6372
}
@@ -67,28 +76,26 @@ public function testProcessWithoutMetadataAwareDefinition()
6776
$pass = new MetadataAwareNameConverterPass();
6877

6978
$containerBuilderProphecy = $this->prophesize(ContainerBuilder::class);
70-
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->willReturn(false)->shouldBeCalled();
7179
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->willReturn(false)->shouldBeCalled();
7280
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldNotBeCalled();
7381

7482
$pass->process($containerBuilderProphecy->reveal());
7583
}
7684

77-
public function testProcessWithMetadataAwareDefinitionSecondArgumentNull()
85+
public function testProcessOnlyOneArg()
7886
{
7987
$pass = new MetadataAwareNameConverterPass();
8088

81-
$arguments = [new Reference('serializer.mapping.class_metadata_factory'), null];
82-
8389
$definition = $this->prophesize(Definition::class);
84-
$definition->getArguments()->willReturn($arguments)->shouldBeCalled();
85-
$definition->getArgument(1)->willReturn($arguments[1])->shouldBeCalled();
90+
$definition->getArguments()->willReturn([0])->shouldBeCalled();
91+
$definition->addArgument(new Reference('app.name_converter'))->shouldBeCalled();
8692

8793
$containerBuilderProphecy = $this->prophesize(ContainerBuilder::class);
88-
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->willReturn(false)->shouldBeCalled();
8994
$containerBuilderProphecy->hasDefinition('serializer.name_converter.metadata_aware')->willReturn(true)->shouldBeCalled();
90-
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->willReturn($definition)->shouldBeCalled();
91-
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldNotBeCalled();
95+
$containerBuilderProphecy->hasAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(true);
96+
$containerBuilderProphecy->getAlias('api_platform.name_converter')->shouldBeCalled()->willReturn(new Alias('app.name_converter'));
97+
$containerBuilderProphecy->setAlias('api_platform.name_converter', 'serializer.name_converter.metadata_aware')->shouldBeCalled();
98+
$containerBuilderProphecy->getDefinition('serializer.name_converter.metadata_aware')->shouldBeCalled()->willReturn($definition);
9299

93100
$pass->process($containerBuilderProphecy->reveal());
94101
}

0 commit comments

Comments
 (0)