8000 Allow serializer default context configuration · symfony/symfony@b0a7d0e · GitHub
[go: up one dir, main page]

Skip to content

Commit b0a7d0e

Browse files
committed
Allow serializer default context configuration
1 parent 7c90c8b commit b0a7d0e

File tree

11 files changed

+74
-7
lines changed

11 files changed

+74
-7
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,12 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
825825
->end()
826826
->end()
827827
->end()
828+
->arrayNode('default_context')
829+
->normalizeKeys(false)
830+
->useAttributeAsKey('name')
831+
->defaultValue([])
832+
->prototype('variable')->end()
833+
->end()
828834
->end()
829835
->end()
830836
->end()

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1527,6 +1527,8 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
15271527
$defaultContext += ['max_depth_handler' => new Reference($config['max_depth_handler'])];
15281528
$container->getDefinition('serializer.normalizer.object')->replaceArgument(6, $defaultContext);
15291529
}
1530+
1531+
$container->setParameter('serializer.default_context', $config['default_context'] ?? []);
15301532
}
15311533

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -231,6 +231,7 @@
231231
<xsd:complexType name="serializer">
232232
<xsd:choice minOccurs="0" maxOccurs="unbounded">
233233
<xsd:element name="mapping" type="file_mapping" />
234+
<xsd:element name="default-context" type="metadata" minOccurs="0" maxOccurs="1" />
234235
</xsd:choice>
235236
<xsd:attribute name="enabled" type="xsd:boolean" />
236237
<xsd:attribute name="enable-annotations" type="xsd:boolean" />

src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer.xml

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@
3232

3333
<!-- Normalizer -->
3434
<service id="serializer.normalizer.constraint_violation_list" class="Symfony\Component\Serializer\Normalizer\ConstraintViolationListNormalizer">
35-
<argument type="collection" />
36-
<argument type="service" id="serializer.name_converter.metadata_aware" />
35+
<argument>%serializer.default_context%</argument>
3736
<!-- Run before serializer.normalizer.object -->
3837
<tag name="serializer.normalizer" priority="-915" />
3938
</service>
@@ -44,6 +43,7 @@
4443
</service>
4544

4645
<service id="serializer.normalizer.dateinterval" class="Symfony\Component\Serializer\Normalizer\DateIntervalNormalizer">
46+
<argument>%serializer.default_context%</argument>
4747
<!-- Run before serializer.normalizer.object -->
4848
<tag name="serializer.normalizer" priority="-915" />
4949
</service>
@@ -55,11 +55,15 @@
5555
</service>
5656

5757
<service id="serializer.normalizer.datetime" class="Symfony\Component\Serializer\Normalizer\DateTimeNormalizer">
58+
<argument>%serializer.default_context%</argument>
5859
<!-- Run before serializer.normalizer.object -->
5960
<tag name="serializer.normalizer" priority="-910" />
6061
</service>
6162

6263
<service id="serializer.normalizer.json_serializable" class="Symfony\Component\Serializer\Normalizer\JsonSerializableNormalizer">
64+
<argument>null</argument>
65+
<argument>null</argument>
66+
<argument>%serializer.default_context%</argument>
6367
<!-- Run before serializer.normalizer.object -->
6468
<tag name="serializer.n F438 ormalizer" priority="-900" />
6569
</service>
@@ -77,7 +81,7 @@
7781
<argument type="service" id="property_info" on-invalid="ignore" />
7882
<argument type="service" id="serializer.mapping.class_discriminator_resolver" on-invalid="ignore" />
7983
<argument>null</argument>
80-
<argument type="collection" />
84+
<argument>%serializer.default_context%</argument>
8185

8286
<!-- Run after all custom normalizers -->
8387
<tag name="serializer.normalizer" priority="-1000" />
@@ -122,6 +126,7 @@
122126

123127
<!-- Encoders -->
124128
<service id="serializer.encoder.xml" class="Symfony\Component\Serializer\Encoder\XmlEncoder">
129+
<argument>%serializer.default_context%</argument>
125130
<tag name="serializer.encoder" />
126131
</service>
127132

@@ -130,10 +135,14 @@
130135
</service>
131136

132137
<service id="serializer.encoder.yaml" class="Symfony\Component\Serializer\Encoder\YamlEncoder">
138+
<argument>null</argument>
139+
<argument>null</argument>
140+
<argument>%serializer.default_context%</argument>
133141
<tag name="serializer.encoder" />
134142
</service>
135143

136144
<service id="serializer.encoder.csv" class="Symfony\Component\Serializer\Encoder\CsvEncoder">
145+
<argument>%serializer.default_context%</argument>
137146
<tag name="serializer.encoder" />
138147
</service>
139148

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,7 @@ protected static function getBundleDefaultConfig()
396396
'enabled' => true,
397397
],
398398
'serializer' => [
399+
'default_context' => [],
399400
'enabled' => !class_exists(FullStack::class),
400401
'enable_annotations' => !class_exists(FullStack::class),
401402
'mapping' => ['paths' => []],

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/full.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
'name_converter' => 'serializer.name_converter.camel_case_to_snake_case',
6767
'circular_reference_handler' => 'my.circular.reference.handler',
6868
'max_depth_handler' => 'my.max.depth.handler',
69+
'default_context' => ['enable_max_depth' => true],
6970
],
7071
'property_info' => true,
7172
'ide' => 'file%%link%%format',

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/full.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,11 @@
3333
</framework:translator>
3434
<framework:validation enabled="true" />
3535
<framework:annotations cache="file" debug="true" file-cache-dir="%kernel.cache_dir%/annotations" />
36-
<framework:serializer enabled="true" enable-annotations="true" name-converter="serializer.name_converter.camel_case_to_snake_case" circular-reference-handler="my.circular.reference.handler" max-depth-handler="my.max.depth.handler" />
36+
<framework:serializer enabled="true" enable-annotations="true" name-converter="serializer.name_converter.camel_case_to_snake_case" circular-reference-handler="my.circular.reference.handler" max-depth-handler="my.max.depth.handler">
37+
<framework:default-context>
38+
<framework:enable_max_depth>true</framework:enable_max_depth>
39+
</framework:default-context>
40+
</framework:serializer>
3741
<framework:property-info />
3842
</framework:config>
3943
</container>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/full.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ framework:
5454
name_converter: serializer.name_converter.camel_case_to_snake_case
5555
circular_reference_handler: my.circular.reference.handler
5656
max_depth_handler: my.max.depth.handler
57+
default_context:
58+
enable_max_depth: true
5759
property_info: ~
5860
ide: file%%link%%format
5961
request:

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1047,9 +1047,8 @@ public function testSerializerEnabled()
10471047
$this->assertNull($container->getDefinition('serializer.mapping.class_metadata_factory')->getArgument(1));
10481048
$this->assertEquals(new Reference('serializer.name_converter.camel_case_to_snake_case'), $container->getDefinition('serializer.name_converter.metadata_aware')->getArgument(1));
10491049
$this->assertEquals(new Reference('property_info', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), $container->getDefinition('serializer.normalizer.object')->getArgument(3));
1050-
$this->assertArrayHasKey('circular_reference_handler', $container->getDefinition('serializer.normalizer.object')->getArgument(6));
1051-
$this->assertArrayHasKey('max_depth_handler', $container->getDefinition('serializer.normalizer.object')->getArgument(6));
1052-
$this->assertEquals($container->getDefinition('serializer.normalizer.object')->getArgument(6)['max_depth_handler'], new Reference('my.max.depth.handler'));
1050+
$this->assertEquals(['setCircularReferenceHandler', [new Reference('my.circular.reference.handler')]], $container->getDefinition('serializer.normalizer.object')->getMethodCalls()[0]);
1051+
$this->assertEquals(['setMaxDepthHandler', [new Reference('my.max.depth.handler')]], $container->getDefinition('serializer.normalizer.object')->getMethodCalls()[1]);
10531052
}
10541053

10551054
public function testRegisterSerializerExtractor()

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

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

5151
$serializerDefinition = $container->getDefinition($this->serializerService);
5252
$serializerDefinition->replaceArgument(0, $normalizers);
53+
$this->addDefaultContextParameter($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->addDefaultContextParameter($encoders, $container);
61+
}
62+
63+
private function addDefaultContextParameter($services, $container)
64+
{
65+
foreach ($services as $service) {
66+
$definition = $container->getDefinition($service);
67+
if (!$definition->isAutowired()) {
68+
continue;
69+
}
70+
71+
if (null === $class = $definition->getClass()) {
72+
continue;
73+
}
74+
75+
$reflection = new \ReflectionClass($class);
76+
77+
if (null === $constructor = $reflection->getConstructor()) {
78+
continue;
79+
}
80+
81+
foreach ($constructor->getParameters() as $arg) {
82+
if ('defaultContext' === $arg->name) {
83+
$definition->setArgument('$defaultContext', '%serializer.default_context%');
84+
}
85+
}
86+
}
5987
}
6088
}

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

Lines changed: 14 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.
@@ -68,4 +69,17 @@ public function testServicesAreOrderedAccordingToPriority()
6869
$this->assertEquals($expected, $definition->getArgument(0));
6970
$this->assertEquals($expected, $definition->getArgument(1));
7071
}
72+
73+
public function testServiceHasDefaultContextParameterArgument()
74+
{
75+
$container = new ContainerBuilder();
76+
77+
$definition = $container->register('serializer')->setClass(ObjectNormalizer::class)->setArguments([null, null, null, null, null, null, null])->addTag('serializer.normalizer')->addTag('serializer.encoder');
78+
$definition->setAutowired(true);
79+
80+
$serializerPass = new SerializerPass();
81+
$serializerPass->process($container);
82+
83+
$this->assertEquals('%serializer.default_context%', $definition->getArgument('$defaultContext'));
84+
}
7185
}

0 commit comments

Comments
 (0)
0