Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 3e3ef44

Browse files
committed
[Serializer] Introduce named serializers
1 parent b50314d commit 3e3ef44

29 files changed

+1225
-190
lines changed

src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ CHANGELOG
99
* Make the `config/` directory optional in `MicroKernelTrait`, add support for service arguments in the
1010
invokable Kernel class, and register `FrameworkBundle` by default when the `bundles.php` file is missing
1111
* [BC BREAK] The `secrets:decrypt-to-local` command terminates with a non-zero exit code when a secret could not be read
12+
* Add support for configuring multiple serializer instances via the configuration
1213

1314
7.1
1415
---

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

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1097,10 +1097,22 @@ private function addAnnotationsSection(ArrayNodeDefinition $rootNode): void
10971097

10981098
private function addSerializerSection(ArrayNodeDefinition $rootNode, callable $enableIfStandalone): void
10991099
{
1100+
$defaultContextNode = fn () => (new NodeBuilder())
1101+
->arrayNode('default_context')
1102+
->normalizeKeys(false)
1103+
->validate()
1104+
->ifTrue(fn () => $this->debug && class_exists(JsonParser::class))
1105+
->then(fn (array $v) => $v + [JsonDecode::DETAILED_ERROR_MESSAGES => true])
1106+
->end()
1107+
->defaultValue([])
1108+
->prototype('variable')->end()
1109+
;
1110+
11001111
$rootNode
11011112
->children()
11021113
->arrayNode('serializer')
11031114
->info('serializer configuration')
1115+
->fixXmlConfig('named_serializer', 'named_serializers')
11041116
->{$enableIfStandalone('symfony/serializer', Serializer::class)}()
11051117
->children()
11061118
->booleanNode('enable_attributes')->{class_exists(FullStack::class) ? 'defaultFalse' : 'defaultTrue'}()->end()
@@ -1116,14 +1128,27 @@ private function addSerializerSection(ArrayNodeDefinition $rootNode, callable $e
11161128
->end()
11171129
->end()
11181130
->end()
1119-
->arrayNode('default_context')
1120-
->normalizeKeys(false)
1131+
->append($defaultContextNode())
1132+
->arrayNode('named_serializers')
1133+
->useAttributeAsKey('name')
1134+
->arrayPrototype()
1135+
->children()
1136+
->scalarNode('name_converter')->end()
1137+
->append($defaultContextNode())
1138+
->booleanNode('include_standard_normalizers')
1139+
->info('Whether to include the standard normalizers')
1140+
->defaultTrue()
1141+
->end()
1142+
->booleanNode('include_standard_encoders')
1143+
->info('Whether to include the standard encoders')
1144+
->defaultTrue()
1145+
->end()
1146+
->end()
1147+
->end()
11211148
->validate()
1122-
->ifTrue(fn () => $this->debug && class_exists(JsonParser::class))
1123-
->then(fn (array $v) => $v + [JsonDecode::DETAILED_ERROR_MESSAGES => true])
1149+
->ifTrue(fn ($v) => isset($v['default']))
1150+
->thenInvalid('"default" is a reserved name.')
11241151
->end()
1125-
->defaultValue([])
1126-
->prototype('variable')->end()
11271152
->end()
11281153
->end()
11291154
->end()

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1907,6 +1907,7 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
19071907
$container->getDefinition('serializer.mapping.cache_warmer')->replaceArgument(0, $serializerLoaders);
19081908

19091909
if (isset($config['name_converter']) && $config['name_converter']) {
1910+
$container->setParameter('.serializer.name_converter', $config['name_converter']);
19101911
$container->getDefinition('serializer.name_converter.metadata_aware')->setArgument(1, new Reference($config['name_converter']));
19111912
}
19121913

@@ -1935,6 +1936,8 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
19351936
$container->getDefinition('serializer.normalizer.object')->setArgument(6, $context);
19361937

19371938
$container->getDefinition('serializer.normalizer.property')->setArgument(5, $defaultContext);
1939+
1940+
$container->setParameter('.serializer.named_serializers', $config['named_serializers'] ?? []);
19381941
}
19391942

19401943
private function registerPropertyInfoConfiguration(ContainerBuilder $container, PhpFileLoader $loader): void

src/Symfony/Bundle/FrameworkBundle/Resources/config/messenger.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@
7272
])
7373

7474
->set('serializer.normalizer.flatten_exception', FlattenExceptionNormalizer::class)
75-
->tag('serializer.normalizer', ['priority' => -880])
75+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -880])
7676

7777
->set('messenger.transport.native_php_serializer', PhpSerializer::class)
7878
->alias('messenger.default_serializer', 'messenger.transport.native_php_serializer')

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,7 @@
320320
<xsd:choice minOccurs="0" maxOccurs="unbounded">
321321
<xsd:element name="mapping" type="file_mapping" />
322322
<xsd:element name="default-context" type="metadata" minOccurs="0" maxOccurs="1" />
323+
<xsd:element name="named-serializer" type="named_serializer_options" />
323324
</xsd:choice>
324325
<xsd:attribute name="enabled" type="xsd:boolean" />
325326
<xsd:attribute name="enable-attributes" type="xsd:boolean" />
@@ -332,6 +333,16 @@
332333
<xsd:attribute name="enabled" type="xsd:boolean" />
333334
</xsd:complexType>
334335

336+
<xsd:complexType name="named_serializer_options">
337+
<xsd:sequence>
338+
<xsd:element name="default-context" type="metadata" minOccurs="0" maxOccurs="1" />
339+
</xsd:sequence>
340+
<xsd:attribute name="name" type="xsd:string" />
341+
<xsd:attribute name="name-converter" type="xsd:string" />
342+
<xsd:attribute name="include-standard-normalizers" type="xsd:boolean" />
343+
<xsd:attribute name="include-standard-encoders" type="xsd:boolean" />
344+
</xsd:complexType>
345+
335346
<xsd:complexType name="property_info">
336347
<xsd:attribute name="enabled" type="xsd:boolean" />
337348
</xsd:complexType>

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

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -79,46 +79,46 @@
7979
->set('serializer.normalizer.constraint_violation_list', ConstraintViolationListNormalizer::class)
8080
->args([1 => service('serializer.name_converter.metadata_aware')])
8181
->autowire(true)
82-
->tag('serializer.normalizer', ['priority' => -915])
82+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
8383

8484
->set('serializer.normalizer.mime_message', MimeMessageNormalizer::class)
8585
->args([service('serializer.normalizer.property')])
86-
->tag('serializer.normalizer', ['priority' => -915])
86+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
8787

8888
->set('serializer.normalizer.datetimezone', DateTimeZoneNormalizer::class)
89-
->tag('serializer.normalizer', ['priority' => -915])
89+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
9090

9191
->set('serializer.normalizer.dateinterval', DateIntervalNormalizer::class)
92-
->tag('serializer.normalizer', ['priority' => -915])
92+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
9393

9494
->set('serializer.normalizer.data_uri', DataUriNormalizer::class)
9595
->args([service('mime_types')->nullOnInvalid()])
96-
->tag('serializer.normalizer', ['priority' => -920])
96+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -920])
9797

9898
->set('serializer.normalizer.datetime', DateTimeNormalizer::class)
99-
->tag('serializer.normalizer', ['priority' => -910])
99+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -910])
100100

101101
->set('serializer.normalizer.json_serializable', JsonSerializableNormalizer::class)
102102
->args([null, null])
103-
->tag('serializer.normalizer', ['priority' => -950])
103+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -950])
104104

105105
->set('serializer.normalizer.problem', ProblemNormalizer::class)
106106
->args([param('kernel.debug'), '$translator' => service('translator')->nullOnInvalid()])
107-
->tag('serializer.normalizer', ['priority' => -890])
107+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -890])
108108

109109
->set('serializer.denormalizer.unwrapping', UnwrappingDenormalizer::class)
110110
->args([service('serializer.property_accessor')])
111-
->tag('serializer.normalizer', ['priority' => 1000])
111+
->tag('serializer.normalizer', ['standard' => true, 'priority' => 1000])
112112

113113
->set('serializer.normalizer.uid', UidNormalizer::class)
114-
->tag('serializer.normalizer', ['priority' => -890])
114+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -890])
115115

116116
->set('serializer.normalizer.translatable', TranslatableNormalizer::class)
117117
->args(['$translator' => service('translator')])
118-
->tag('serializer.normalizer', ['priority' => -920])
118+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -920])
119119

120120
->set('serializer.normalizer.form_error', FormErrorNormalizer::class)
121-
->tag('serializer.normalizer', ['priority' => -915])
121+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
122122

123123
->set('serializer.normalizer.object', ObjectNormalizer::class)
124124
->args([
@@ -131,7 +131,7 @@
131131
null,
132132
service('property_info')->ignoreOnInvalid(),
133133
])
134-
->tag('serializer.normalizer', ['priority' => -1000])
134+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -1000])
135135

136136
->set('serializer.normalizer.property', PropertyNormalizer::class)
137137
->args([
@@ -143,7 +143,7 @@
143143
])
144144

145145
->set('serializer.denormalizer.array', ArrayDenormalizer::class)
146-
->tag('serializer.normalizer', ['priority' => -990])
146+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -990])
147147

148148
// Loader
149149
->set('serializer.mapping.chain_loader', LoaderChain::class)
@@ -173,25 +173,29 @@
173173

174174
// Encoders
175175
->set('serializer.encoder.xml', XmlEncoder::class)
176-
->tag('serializer.encoder')
176+
->tag('serializer.encoder', ['standard' => true])
177177

178178
->set('serializer.encoder.json', JsonEncoder::class)
179179
->args([null, null])
180-
->tag('serializer.encoder')
180+
->tag('serializer.encoder', ['standard' => true])
181181

182182
->set('serializer.encoder.yaml', YamlEncoder::class)
183183
->args([null, null])
184-
->tag('serializer.encoder')
184+
->tag('serializer.encoder', ['standard' => true])
185185

186186
->set('serializer.encoder.csv', CsvEncoder::class)
187-
->tag('serializer.encoder')
187+
->tag('serializer.encoder', ['standard' => true])
188188

189189
// Name converter
190190
->set('serializer.name_converter.camel_case_to_snake_case', CamelCaseToSnakeCaseNameConverter::class)
191191

192-
->set('serializer.name_converter.metadata_aware', MetadataAwareNameConverter::class)
192+
->set('serializer.name_converter.metadata_aware.abstract', MetadataAwareNameConverter::class)
193+
->abstract()
193194
->args([service('serializer.mapping.class_metadata_factory')])
194195

196+
->set('serializer.name_converter.metadata_aware')
197+
->parent('serializer.name_converter.metadata_aware.abstract')
198+
195199
// PropertyInfo extractor
196200
->set('property_info.serializer_extractor', SerializerExtractor::class)
197201
->args([service('serializer.mapping.class_metadata_factory')])
@@ -214,6 +218,6 @@
214218
])
215219

216220
->set('serializer.normalizer.backed_enum', BackedEnumNormalizer::class)
217-
->tag('serializer.normalizer', ['priority' => -915])
221+
->tag('serializer.normalizer', ['standard' => true, 'priority' => -915])
218222
;
219223
};

src/Symfony/Bundle/FrameworkBundle/Resources/config/serializer_debug.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
->args([
2222
service('debug.serializer.inner'),
2323
service('serializer.data_collector'),
24+
'default',
2425
])
2526

2627
->set('serializer.data_collector', SerializerDataCollector::class)

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

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ protected static function getBundleDefaultConfig()
758758
'enabled' => true,
759759
'enable_attributes' => !class_exists(FullStack::class),
760760
'mapping' => ['paths' => []],
761+
'named_serializers' => [],
761762
],
762763
'property_access' => [
763764
'enabled' => true,
@@ -933,4 +934,21 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
933934
],
934935
];
935936
}
937+
938+
public function testNamedSerializersReservedName()
939+
{
940+
$processor = new Processor();
941+
$configuration = new Configuration(true);
942+
943+
$this->expectException(InvalidConfigurationException::class);
944+
$this->expectExceptionMessage('Invalid configuration for path "framework.serializer.named_serializers": "default" is a reserved name.');
945+
946+
$processor->processConfiguration($configuration, [[
947+
'serializer' => [
948+
'named_serializers' => [
949+
'default' => ['include_standard_normalizers' => false],
950+
],
951+
],
952+
]]);
953+
}
936954
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,13 @@
6868
'circular_reference_handler' => 'my.circular.reference.handler',
6969
'max_depth_handler' => 'my.max.depth.handler',
7070
'default_context' => ['enable_max_depth' => true],
71+
'named_serializers' => [
72+
'api' => [
73+
'include_standard_normalizers' => true,
74+
'include_standard_encoders' => true,
75+
'default_context' => ['enable_max_depth' => false],
76+
],
77+
],
7178
],
7279
'property_info' => true,
7380
'type_info' => true,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,11 @@
3838
<framework:default-context>
3939
<framework:enable_max_depth>true</framework:enable_max_depth>
4040
</framework:default-context>
41+
<framework:named-serializer name="api" include-standard-normalizers="true" include-standard-encoders="true">
42+
<framework:default-context>
43+
<framework:enable_max_depth>false</framework:enable_max_depth>
44+
</framework:default-context>
45+
</framework:named-serializer>
4146
</framework:serializer>
4247
<framework:property-info />
4348
<framework:type-info />

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,12 @@ framework:
5959
max_depth_handler: my.max.depth.handler
6060
default_context:
6161
enable_max_depth: true
62+
named_serializers:
63+
api:
64+
include_standard_normalizers: true
65+
include_standard_encoders: true
66+
default_context:
67+
enable_max_depth: false
6268
type_info: ~
6369
property_info: ~
6470
ide: file%%link%%format

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1458,6 +1458,26 @@ public function testSerializerWithoutTranslator()
14581458
$this->assertFalse($container->hasDefinition('serializer.normalizer.translatable'));
14591459
}
14601460

1461+
public function testSerializerDefaultParameters()
1462+
{
1463+
$container = $this->createContainerFromFile('serializer_enabled');
1464+
$this->assertFalse($container->hasParameter('.serializer.name_converter'));
1465+
$this->assertFalse($container->hasParameter('serializer.default_context'));
1466+
$this->assertTrue($container->hasParameter('.serializer.named_serializers'));
1467+
$this->assertSame([], $container->getParameter('.serializer.named_serializers'));
1468+
}
1469+
1470+
public function testSerializerParametersAreSet()
1471+
{
1472+
$container = $this->createContainerFromFile('full');
1473+
$this->assertTrue($container->hasParameter('.serializer.name_converter'));
1474+
$this->assertSame('serializer.name_converter.camel_case_to_snake_case', $container->getParameter('.serializer.name_converter'));
1475+
$this->assertTrue($container->hasParameter('serializer.default_context'));
1476+
$this->assertSame(['enable_max_depth' => true], $container->getParameter('serializer.default_context'));
1477+
$this->assertTrue($container->hasParameter('.serializer.named_serializers'));
1478+
$this->assertSame(['api' => ['include_standard_normalizers' => true, 'include_standard_encoders' => true, 'default_context' => ['enable_max_depth' => false]]], $container->getParameter('.serializer.named_serializers'));
1479+
}
1480+
14611481
public function testRegisterSerializerExtractor()
14621482
{
14631483
$container = $this->createContainerFromFile('full');

src/Symfony/Bundle/WebProfilerBundle/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
CHANGELOG
22
=========
33

4+
7.2
5+
---
6+
7+
* Add support for displaying profiles of multiple serializer instances
8+
49
7.1
510
---
611

0 commit comments

Comments
 (0)