Skip to content

Commit acf5fbc

Browse files
committed
[FrameworkBundle] Fix setting default context for certain normalizers
1 parent f60c3cf commit acf5fbc

File tree

6 files changed

+100
-63
lines changed

6 files changed

+100
-63
lines changed

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1855,18 +1855,20 @@ private function registerSerializerConfiguration(array $config, ContainerBuilder
18551855
}
18561856

18571857
$arguments = $container->getDefinition('serializer.normalizer.object')->getArguments();
1858-
$context = [];
1858+
$context = $arguments[6] ?? $defaultContext;
18591859

18601860
if (isset($config['circular_reference_handler']) && $config['circular_reference_handler']) {
1861-
$context += ($arguments[6] ?? $defaultContext) + ['circular_reference_handler' => new Reference($config['circular_reference_handler'])];
1861+
$context += ['circular_reference_handler' => new Reference($config['circular_reference_handler'])];
18621862
$container->getDefinition('serializer.normalizer.object')->setArgument(5, null);
18631863
}
18641864

18651865
if ($config['max_depth_handler'] ?? false) {
1866-
$context += ($arguments[6] ?? $defaultContext) + ['max_depth_handler' => new Reference($config['max_depth_handler'])];
1866+
$context += ['max_depth_handler' => new Reference($config['max_depth_handler'])];
18671867
}
18681868

18691869
$container->getDefinition('serializer.normalizer.object')->setArgument(6, $context);
1870+
1871+
$container->getDefinition('serializer.normalizer.property')->setArgument(5, $defaultContext);
18701872
}
18711873

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

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@
139139
service('property_info')->ignoreOnInvalid(),
140140
service('serializer.mapping.class_discriminator_resolver')->ignoreOnInvalid(),
141141
null,
142-
[],
143142
])
144143

145144
->alias(PropertyNormalizer::class, 'serializer.normalizer.property')

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/SerializerTest.php

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ public function testDeserializeArrayOfObject()
3838
*/
3939
public function testNormalizersAndEncodersUseDefaultContextConfigOption(string $normalizerId)
4040
{
41-
static::bootKernel(['test_case' => 'Serializer']);
41+
self::deleteTmpDir();
42+
static::bootKernel(['test_case' => 'Serializer', 'root_config' => 'default_context.yaml']);
4243

4344
$normalizer = static::getContainer()->get($normalizerId);
4445

@@ -52,20 +53,29 @@ public function testNormalizersAndEncodersUseDefaultContextConfigOption(string $
5253
self::assertEquals('foo', $defaultContext['fake_context_option']);
5354
}
5455

55-
public static function provideNormalizersAndEncodersWithDefaultContextOption(): array
56+
public static function provideNormalizersAndEncodersWithDefaultContextOption(): iterable
5657
{
57-
return [
58-
['serializer.normalizer.constraint_violation_list.alias'],
59-
['serializer.normalizer.dateinterval.alias'],
60-
['serializer.normalizer.datetime.alias'],
61-
['serializer.normalizer.json_serializable.alias'],
62-
['serializer.normalizer.problem.alias'],
63-
['serializer.normalizer.uid.alias'],
64-
['serializer.normalizer.object.alias'],
65-
['serializer.encoder.xml.alias'],
66-
['serializer.encoder.yaml.alias'],
67-
['serializer.encoder.csv.alias'],
68-
];
58+
$kernel = static::createKernel(['test_case' => 'Serializer', 'root_config' => 'default_context.yaml']);
59+
$container = $kernel->getContainerWithLoadedExtensions();
60+
61+
$services = array_merge(
62+
$container->findTaggedServiceIds('serializer.normalizer'),
63+
$container->findTaggedServiceIds('serializer.encoder')
64+
);
65+
foreach ($services as $serviceId => $attributes) {
66+
$class = $container->getDefinition($serviceId)->getClass();
67+
if (null === $reflectionConstructor = (new \ReflectionClass($class))->getConstructor()) {
68+
continue;
69+
}
70+
foreach ($reflectionConstructor->getParameters() as $reflectionParam) {
71+
if ('array $defaultContext' === $reflectionParam->getType()->getName().' $'.$reflectionParam->getName()) {
72+
yield [$serviceId.'.alias'];
73+
break;
74+
}
75+
}
76+
}
77+
78+
yield ['serializer.normalizer.property.alias']; // Special case as this normalizer isn't tagged
6979
}
7080
}
7181

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/AppKernel.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,16 @@ public function getAlias(): string
135135
{
136136
return 'foo';
137137
}
138+
139+
public function getContainerWithLoadedExtensions()
140+
{
141+
self::initializeBundles();
142+
$container = self::buildContainer();
143+
144+
foreach ($container->getExtensions() as $extension) {
145+
$extension->load($container->getExtensionConfig($extension->getAlias()), $container);
146+
}
147+
148+
return $container;
149+
}
138150
}

src/Symfony/Bundle/FrameworkBundle/Tests/Functional/app/Serializer/config.yml

Lines changed: 0 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,58 +8,13 @@ framework:
88
max_depth_handler: Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Serializer\MaxDepthHandler
99
default_context:
1010
enable_max_depth: true
11-
fake_context_option: foo
1211
property_info: { enabled: true }
1312

1413
services:
1514
serializer.alias:
1615
alias: serializer
1716
public: true
1817

19-
serializer.normalizer.constraint_violation_list.alias:
20-
alias: serializer.normalizer.constraint_violation_list
21-
public: true
22-
23-
serializer.normalizer.dateinterval.alias:
24-
alias: serializer.normalizer.dateinterval
25-
public: true
26-
27-
serializer.normalizer.datetime.alias:
28-
alias: serializer.normalizer.datetime
29-
public: true
30-
31-
serializer.normalizer.json_serializable.alias:
32-
alias: serializer.normalizer.json_serializable
33-
public: true
34-
35-
serializer.normalizer.problem.alias:
36-
alias: serializer.normalizer.problem
37-
public: true
38-
39-
serializer.normalizer.uid.alias:
40-
alias: serializer.normalizer.uid
41-
public: true
42-
43-
serializer.normalizer.property.alias:
44-
alias: serializer.normalizer.property
45-
public: true
46-
47-
serializer.normalizer.object.alias:
48-
alias: serializer.normalizer.object
49-
public: true
50-
51-
serializer.encoder.xml.alias:
52-
alias: serializer.encoder.xml
53-
public: true
54-
55-
serializer.encoder.yaml.alias:
56-
alias: serializer.encoder.yaml
57-
public: true
58-
59-
serializer.encoder.csv.alias:
60-
alias: serializer.encoder.csv
61-
public: true
62-
6318
Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Serializer\CircularReferenceHandler: ~
6419

6520
Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Serializer\MaxDepthHandler: ~
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
imports:
2+
- { resource: ../config/default.yml }
3+
4+
framework:
5+
serializer:
6+
enabled: true
7+
circular_reference_handler: ~ # This must be null
8+
max_depth_handler: ~ # This must be null
9+
default_context:
10+
fake_context_option: foo
11+
12+
services:
13+
serializer.normalizer.constraint_violation_list.alias:
14+
alias: serializer.normalizer.constraint_violation_list
15+
public: true
16+
17+
serializer.normalizer.dateinterval.alias:
18+
alias: serializer.normalizer.dateinterval
19+
public: true
20+
21+
serializer.normalizer.datetime.alias:
22+
alias: serializer.normalizer.datetime
23+
public: true
24+
25+
serializer.normalizer.json_serializable.alias:
26+
alias: serializer.normalizer.json_serializable
27+
public: true
28+
29+
serializer.normalizer.object.alias:
30+
alias: serializer.normalizer.object
31+
public: true
32+
33+
serializer.normalizer.problem.alias:
34+
alias: serializer.normalizer.problem
35+
public: true
36+
37+
serializer.normalizer.property.alias:
38+
alias: serializer.normalizer.property
39+
public: true
40+
41+
serializer.normalizer.uid.alias:
42+
alias: serializer.normalizer.uid
43+
public: true
44+
45+
serializer.encoder.csv.alias:
46+
alias: serializer.encoder.csv
47+
public: true
48+
49+
serializer.encoder.json.alias:
50+
alias: serializer.encoder.json
51+
public: true
52+
53+
serializer.encoder.xml.alias:
54+
alias: serializer.encoder.xml
55+
public: true
56+
57+
serializer.encoder.yaml.alias:
58+
alias: serializer.encoder.yaml
59+
public: true

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy