8000 serializer default context binded parameter · symfony/symfony@60c9bc8 · GitHub
[go: up one dir, main page]

Skip to content

Commit 60c9bc8

Browse files
committed
serializer default context binded parameter
1 parent 6a9d1a3 commit 60c9bc8

File tree

6 files changed

+41
-6
lines changed

6 files changed

+41
-6
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -826,7 +826,7 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
826826
->arrayNode('default_context')
827827
->normalizeKeys(false)
828828
->useAttributeAsKey('name')
829-
->defaultValue(array())
829+
->defaultValue([])
830830
->prototype('variable')->end()
831831
->end()
832832
->end()

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1417,9 +1417,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
14171417
$container->getDefinition('serializer.normalizer.object')->addMethodCall('setMaxDepthHandler', [new Reference($config['max_depth_handler'])]);
14181418
}
14191419

1420-
if ($config['default_context'] ?? false) {
1421-
$container->getDefinition('serializer.normalizer.object')->setArgument('default_context', $config['default_context']);
1422-
}
1420+
$container->setParameter('serializer.default_context', $config['default_context'] ?? []);
14231421
}
14241422

14251423
private function registerPropertyInfoConfiguration(ContainerBuilder $container, XmlFileLoader $loader)

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@
236236
<xsd:complexType name="serializer">
237237
<xsd:choice minOccurs="0" maxOccurs="unbounded">
238238
<xsd:element name="mapping" type="file_mapping" />
239-
<xsd:element name="default_context" type="metadata" minOccurs="0" maxOccurs="unbounded" />
239+
<xsd:element name="default_context" type="metadata" minOccurs="0" maxOccurs="1" />
240240
</xsd:choice>
241241
<xsd:attribute name="enabled" type="xsd:boolean" />
242242
<xsd:attribute name="cache" type="xsd:string" />

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1068,7 +1068,6 @@ public function testSerializerEnabled()
10681068
$this->assertEquals(new Reference('property_info', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), $container->getDefinition('serializer.normalizer.object')->getArgument(3));
10691069
$this->assertEquals(['setCircularReferenceHandler', [new Reference('my.circular.reference.handler')]], $container->getDefinition('serializer.normalizer.object')->getMethodCalls()[0]);
10701070
$this->assertEquals(['setMaxDepthHandler', [new Reference('my.max.depth.handler')]], $container->getDefinition('serializer.normalizer.object')->getMethodCalls()[1]);
1071-
$this->assertEquals(['enable_max_depth' => true], $container->getDefinition('serializer.normalizer.object')->getArgument('default_context'));
10721071
}
10731072

10741073
public function testRegisterSerializerExtractor()

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,36 @@ public function process(ContainerBuilder $container)
5050

5151
$serializerDefinition = $container->getDefinition($this->serializerService);
5252
$serializerDefinition->replaceArgument(0, $normalizers);
53+
$this->addDefaultContextParameterBinding($normalizers, $container);
5354

5455
if (!$encoders = $this->findAndSortTaggedServices($this->encoderTag, $container)) {
5556
throw new RuntimeException(sprintf('You must tag at least one service as "%s" to use the "%s" service.', $this->encoderTag, $this->serializerService));
5657
}
5758

5859
$serializerDefinition->replaceArgument(1, $encoders);
60+
$this->addDefaultContextParameterBinding($encoders, $container);
61+
}
62+
63+
private function addDefaultContextParameterBinding($services, $container)
64+
{
65+
foreach ($services as $service) {
66+
$definition = $container->getDefinition($service);
67+
if (null === $class = $definition->getClass()) {
68+
continue;
69+
}
70+
71+
$reflection = new \ReflectionClass($class);
72+
73+
if (null === $constructor = $reflection->getConstructor()) {
74+
continue;
75+
}
76+
77+
foreach ($constructor->getParameters() as $arg) {
78+
if ('defaultContext' === $arg->name) {
79+
$definition->setBindings(['$defaultContext' => '%serializer.default_context%']);
80+
break;
81+
}
82+
}
83+
}
5984
}
6085
}

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\DependencyInjection\ContainerBuilder;
1616
use Symfony\Component\DependencyInjection\Reference;
1717
use Symfony\Component\Serializer\DependencyInjection\SerializerPass;
18+
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
1819

1920
/**
2021
* Tests for the SerializerPass class.
@@ -72,4 +73,16 @@ public function testServicesAreOrderedAccordingToPriority()
7273
$this->assertEquals($expected, $definition->getArgument(0));
7374
$this->assertEquals($expected, $definition->getArgument(1));
7475
}
76+
77+
public function testServiceHasDefaultContextParameterBinding()
78+
{
79+
$container = new ContainerBuilder();
80+
81+
$definition = $container->register('serializer')->setClass(ObjectNormalizer::class)->setArguments([null, null, null, null, null, null, null])->addTag('serializer.normalizer')->addTag('serializer.encoder');
82+
83+
$serializerPass = new SerializerPass();
84+
$serializerPass->process($container);
85+
86+
$this->assertArrayHasKey('$defaultContext', $definition->getBindings());
87+
}
7588
}

0 commit comments

Comments
 (0)
0