Skip to content

Commit 53e430b

Browse files
committed
Allow serializer default context configuration
1 parent 4612991 commit 53e430b

File tree

9 files changed

+46
-1
lines changed

9 files changed

+46
-1
lines changed

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

+6
Original file line numberDiff line numberDiff line change
@@ -1005,6 +1005,12 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode, callable $e
10051005
->end()
10061006
->end()
10071007
->end()
1008+
->arrayNode('default_context')
1009+
->normalizeKeys(false)
1010+
->useAttributeAsKey('name')
1011+
->defaultValue([])
1012+
->prototype('variable')->end()
1013+
->end()
10081014
->end()
10091015
->end()
10101016
->end()

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

+4
Original file line numberDiff line numberDiff line change
@@ -1805,6 +1805,10 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
18051805
$defaultContext += ['max_depth_handler' => new Reference($config['max_depth_handler'])];
18061806
$container->getDefinition('serializer.normalizer.object')->replaceArgument(6, $defaultContext);
18071807
}
1808+
1809+
if (isset($config['default_context']) && $config['default_context']) {
1810+
$container->setParameter('serializer.default_context', $config['default_context']);
1811+
}
18081812
}
18091813

18101814
private function registerPropertyInfoConfiguration(ContainerBuilder $container, PhpFileLoader $loader)

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

+1
Original file line numberDiff line numberDiff line change
@@ -266,6 +266,7 @@
266266
<xsd:complexType name="serializer">
267267
<xsd:choice minOccurs="0" maxOccurs="unbounded">
268268
<xsd:element name="mapping" type="file_mapping" />
269+
<xsd:element name="default-context" type="metadata" minOccurs="0" maxOccurs="1" />
269270
</xsd:choice>
270271
<xsd:attribute name="enabled" type="xsd:boolean" />
271272
<xsd:attribute name="enable-annotations" type="xsd:boolean" />

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

+1
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ protected static function getBundleDefaultConfig()
446446
'enabled' => true,
447447
],
448448
'serializer' => [
449+
'default_context' => [],
449450
'enabled' => !class_exists(FullStack::class),
450451
'enable_annotations' => !class_exists(FullStack::class),
451452
'mapping' => ['paths' => []],

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

+1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
'name_converter' => 'serializer.name_converter.camel_case_to_snake_case',
6868
'circular_reference_handler' => 'my.circular.reference.handler',
6969
'max_depth_handler' => 'my.max.depth.handler',
70+
'default_context' => ['enable_max_depth' => true],
7071
],
7172
'property_info' => true,
7273
'ide' => 'file%%link%%format',

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

+5-1
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

+2
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ framework:
5555
name_converter: serializer.name_converter.camel_case_to_snake_case
5656
circular_reference_handler: my.circular.reference.handler
5757
max_depth_handler: my.max.depth.handler
58+
default_context:
59+
enable_max_depth: true
5860
property_info: ~
5961
ide: file%%link%%format
6062
request:

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

+11
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\Serializer\DependencyInjection;
1313

14+
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
1415
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1516
use Symfony\Component\DependencyInjection\Compiler\PriorityTaggedServiceTrait;
1617
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -60,5 +61,15 @@ public function process(ContainerBuilder $container)
6061
}
6162

6263
$serializerDefinition->replaceArgument(1, $encoders);
64+
65+
if ($container->hasParameter('serializer.default_context')) {
66+
$defaultContext = $container->getParameter('serializer.default_context');
67+
foreach (array_keys(array_merge($container->findTaggedServiceIds($this->normalizerTag), $container->findTaggedServiceIds($this->encoderTag))) as $service) {
68+
$definition = $container->getDefinition($service);
69+
$definition->setBindings(['array $defaultContext' => new BoundArgument($defaultContext, false)] + $definition->getBindings());
70+
}
71+
72+
$container->getParameterBag()->remove('serializer.default_context');
73+
}
6374
}
6475
}

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

+15
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Serializer\Tests\DependencyInjection;
1313

1414
use PHPUnit\Framework\TestCase;
15+
use Symfony\Component\DependencyInjection\Argument\BoundArgument;
1516
use Symfony\Component\DependencyInjection\ContainerBuilder;
1617
use Symfony\Component\DependencyInjection\Reference;
1718
use Symfony\Component\Serializer\DependencyInjection\SerializerPass;
@@ -68,4 +69,18 @@ public function testServicesAreOrderedAccordingToPriority()
6869
$this->assertEquals($expected, $definition->getArgument(0));
6970
$this->assertEquals($expected, $definition->getArgument(1));
7071
}
72+
73+
public function testBindSerializerDefaultContext()
74+
{
75+
$container = new ContainerBuilder();
76+
$container->register('serializer')->setArguments([null, null]);
77+
$container->setParameter('serializer.default_context', ['enable_max_depth' => true]);
78+
$definition = $container->register('n1')->addTag('serializer.normalizer')->addTag('serializer.encoder');
79+
80+
$serializerPass = new SerializerPass();
81+
$serializerPass->process($container);
82+
83+
$bindings = $definition->getBindings();
84+
$this->assertEquals($bindings['array $defaultContext'], new BoundArgument(['enable_max_depth' => true], false));
85+
}
7186
}

0 commit comments

Comments
 (0)