8000 [Serializer] Preserve array keys while denormalize variadic parameters · symfony/symfony@c1f844a · GitHub
[go: up one dir, main page]

Skip to content

Commit c1f844a

Browse files
melyanicolas-grekas
authored andcommitted
[Serializer] Preserve array keys while denormalize variadic parameters
1 parent 6895b5c commit c1f844a

File tree

2 files changed

+32
-2
lines changed

2 files changed

+32
-2
lines changed

src/Symfony/Component/Serializer/Normalizer/AbstractNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,8 @@ protected function instantiateObject(array &$data, string $class, array &$contex
362362
}
363363

364364
$variadicParameters = [];
365-
foreach ($data[$paramName] as $parameterData) {
366-
$variadicParameters[] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format);
365+
foreach ($data[$paramName] as $parameterKey => $parameterData) {
366+
$variadicParameters[$parameterKey] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $context, $format);
367367
}
368368

369369
$params = array_merge($params, $variadicParameters);

src/Symfony/Component/Serializer/Tests/Normalizer/AbstractNormalizerTest.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,36 @@ public function testObjectWithVariadicConstructorTypedArguments(AbstractNormaliz
201201
}
202202
}
203203

204+
/**
205+
* @dataProvider getNormalizer
206+
*/
207+
public function testVariadicSerializationWithPreservingKeys(AbstractNormalizer $normalizer)
208+
{
209+
$d1 = new Dummy();
210+
$d1->foo = 'Foo';
211+
$d1->bar = 'Bar';
212+
$d1->baz = 'Baz';
213+
$d1->qux = 'Quz';
214+
$d2 = new Dummy();
215+
$d2->foo = 'FOO';
216+
$d2->bar = 'BAR';
217+
$d2->baz = 'BAZ';
218+
$d2->qux = 'QUZ';
219+
$arr = ['d1' => $d1, 'd2' => $d2];
220+
$obj = new VariadicConstructorTypedArgsDummy(...$arr);
221+
222+
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
223+
$normalizer->setSerializer($serializer);
224+
$this->assertEquals(
225+
'{"foo":{"d1":{"foo":"Foo","bar":"Bar","baz":"Baz","qux":"Quz"},"d2":{"foo":"FOO","bar":"BAR","baz":"BAZ","qux":"QUZ"}}}',
226+
$data = $serializer->serialize($obj, 'json')
227+
);
228+
229+
$dummy = $normalizer->denormalize(json_decode($data, true), VariadicConstructorTypedArgsDummy::class);
230+
$this->assertInstanceOf(VariadicConstructorTypedArgsDummy::class, $dummy);
231+
$this->assertEquals($arr, $dummy->getFoo());
232+
}
233+
204234
public static function getNormalizer()
205235
{
206236
$extractor = new PhpDocExtractor();

0 commit comments

Comments
 (0)
0