Skip to content

Commit

Permalink
[Serializer] Preserve array keys while denormalize variadic parameters
Browse files Browse the repository at this point in the history
  • Loading branch information
melya authored and nicolas-grekas committed Mar 31, 2023
1 parent 6895b5c commit c1f844a
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 2 deletions.
Expand Up @@ -362,8 +362,8 @@ protected function instantiateObject(array &$data, string $class, array &$contex
}

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

$params = array_merge($params, $variadicParameters);
Expand Down
Expand Up @@ -201,6 +201,36 @@ public function testObjectWithVariadicConstructorTypedArguments(AbstractNormaliz
}
}

/**
* @dataProvider getNormalizer
*/
public function testVariadicSerializationWithPreservingKeys(AbstractNormalizer $normalizer)
{
$d1 = new Dummy();
$d1->foo = 'Foo';
$d1->bar = 'Bar';
$d1->baz = 'Baz';
$d1->qux = 'Quz';
$d2 = new Dummy();
$d2->foo = 'FOO';
$d2->bar = 'BAR';
$d2->baz = 'BAZ';
$d2->qux = 'QUZ';
$arr = ['d1' => $d1, 'd2' => $d2];
$obj = new VariadicConstructorTypedArgsDummy(...$arr);

$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$normalizer->setSerializer($serializer);
$this->assertEquals(
'{"foo":{"d1":{"foo":"Foo","bar":"Bar","baz":"Baz","qux":"Quz"},"d2":{"foo":"FOO","bar":"BAR","baz":"BAZ","qux":"QUZ"}}}',
$data = $serializer->serialize($obj, 'json')
);

$dummy = $normalizer->denormalize(json_decode($data, true), VariadicConstructorTypedArgsDummy::class);
$this->assertInstanceOf(VariadicConstructorTypedArgsDummy::class, $dummy);
$this->assertEquals($arr, $dummy->getFoo());
}

public static function getNormalizer()
{
$extractor = new PhpDocExtractor();
Expand Down

0 comments on commit c1f844a

Please sign in to comment.