Skip to content

Commit 9971e31

Browse files
committed
feature #26108 [Serializer] Add a MaxDepth handler (dunglas)
This PR was squashed before being merged into the 4.1-dev branch (closes #26108). Discussion ---------- [Serializer] Add a MaxDepth handler | Q | A | ------------- | --- | Branch? | master | Bug fix? | no | New feature? | yes <!-- don't forget to update src/**/CHANGELOG.md files --> | BC breaks? | no | Deprecations? | no <!-- don't forget to update UPGRADE-*.md files --> | Tests pass? | yes | Fixed tickets | api-platform/core#1130, api-platform/core#1528, api-platform/core#1528 <!-- #-prefixed issue number(s), if any --> | License | MIT | Doc PR | todo <!--highly recommended for new features--> Sometimes, instead of just stopping the serialization process when the configured max depth is reached, it can be interesting to let the user return something (like returning the identifier of the entity to stop manually the serialization process). This PR also makes the max depth handling more similar to circular references handling (that already has the possibility to set a handler). Commits ------- ed975c764b [Serializer] Add a MaxDepth handler
2 parents ba4d6d4 + 0fa3798 commit 9971e31

File tree

7 files changed

+10
-1
lines changed

7 files changed

+10
-1
lines changed

DependencyInjection/Configuration.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -731,6 +731,7 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode)
731731
->booleanNode('enable_annotations')->{!class_exists(FullStack::class) && class_exists(Annotation::class) ? 'defaultTrue' : 'defaultFalse'}()->end()
732732
->scalarNode('name_converter')->end()
733733
->scalarNode('circular_reference_handler')->end()
734+
->scalarNode('max_depth_handler')->end()
734735
->arrayNode('mapping')
735736
->addDefaultsIfNotSet()
736737
->fixXmlConfig('path')

DependencyInjection/FrameworkExtension.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1275,6 +1275,10 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
12751275
if (isset($config['circular_reference_handler']) && $config['circular_reference_handler']) {
12761276
$container->getDefinition('serializer.normalizer.object')->addMethodCall('setCircularReferenceHandler', array(new Reference($config['circular_reference_handler'])));
12771277
}
1278+
1279+
if ($config['max_depth_handler'] ?? false) {
1280+
$container->getDefinition('serializer.normalizer.object')->addMethodCall('setMaxDepthHandler', array(new Reference($config['max_depth_handler'])));
1281+
}
12781282
}
12791283

12801284
private function registerPropertyInfoConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)

Resources/config/schema/symfony-1.0.xsd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@
239239
<xsd:attribute name="cache" type="xsd:string" />
240240
<xsd:attribute name="enable-annotations" type="xsd:boolean" />
241241
<xsd:attribute name="name-converter" type="xsd:string" />
242+
<xsd:attribute name="max-depth-handler" type="xsd:string" />
242243
</xsd:complexType>
243244

244245
<xsd:complexType name="property_info">

Tests/DependencyInjection/Fixtures/php/full.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@
6868
'enabled' => true,
6969
'enable_annotations' => true,
7070
'name_converter' => 'serializer.name_converter.camel_case_to_snake_case',
71+
'max_depth_handler' => 'my.max.depth.handler',
7172
),
7273
'property_info' => true,
7374
'ide' => 'file%%link%%format',

Tests/DependencyInjection/Fixtures/xml/full.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
</framework:translator>
4242
<framework:validation enabled="true" />
4343
<framework:annotations cache="file" debug="true" file-cache-dir="%kernel.cache_dir%/annotations" />
44-
<framework:serializer enabled="true" enable-annotations="true" name-converter="serializer.name_converter.camel_case_to_snake_case" />
44+
<framework:serializer enabled="true" enable-annotations="true" name-converter="serializer.name_converter.camel_case_to_snake_case" max-depth-handler="my.max.depth.handler" />
4545
<framework:property-info />
4646
</framework:config>
4747
</container>

Tests/DependencyInjection/Fixtures/yml/full.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ framework:
5454
enabled: true
5555
enable_annotations: true
5656
name_converter: serializer.name_converter.camel_case_to_snake_case
57+
max_depth_handler: my.max.depth.handler
5758
property_info: ~
5859
ide: file%%link%%format
5960
request:

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -807,6 +807,7 @@ public function testSerializerEnabled()
807807
$this->assertNull($container->getDefinition('serializer.mapping.class_metadata_factory')->getArgument(1));
808808
$this->assertEquals(new Reference('serializer.name_converter.camel_case_to_snake_case'), $container->getDefinition('serializer.normalizer.object')->getArgument(1));
809809
$this->assertEquals(new Reference('property_info', ContainerBuilder::IGNORE_ON_INVALID_REFERENCE), $container->getDefinition('serializer.normalizer.object')->getArgument(3));
810+
$this->assertEquals(array('setMaxDepthHandler', array(new Reference('my.max.depth.handler'))), $container->getDefinition('serializer.normalizer.object')->getMethodCalls()[0]);
810811
}
811812

812813
public function testRegisterSerializerExtractor()

0 commit comments

Comments
 (0)