Add support for variadic arguments in the GetSetNormalizer
This commit is contained in:
parent
69171d48ea
commit
704760b276
@ -136,11 +136,19 @@ class GetSetMethodNormalizer extends SerializerAwareNormalizer implements Normal
|
|||||||
foreach ($constructorParameters as $constructorParameter) {
|
foreach ($constructorParameters as $constructorParameter) {
|
||||||
$paramName = lcfirst($this->formatAttribute($constructorParameter->name));
|
$paramName = lcfirst($this->formatAttribute($constructorParameter->name));
|
||||||
|
|
||||||
if (isset($normalizedData[$paramName])) {
|
if (method_exists($constructorParameter, 'isVariadic') && $constructorParameter->isVariadic()) {
|
||||||
|
if (isset($normalizedData[$paramName])) {
|
||||||
|
if (!is_array($normalizedData[$paramName])) {
|
||||||
|
throw new RuntimeException(sprintf('Cannot create an instance of %s from serialized data because the variadic parameter %s can only accept an array.', $class, $constructorParameter->name));
|
||||||
|
}
|
||||||
|
|
||||||
|
$params = array_merge($params, $normalizedData[$paramName]);
|
||||||
|
}
|
||||||
|
} elseif (isset($normalizedData[$paramName])) {
|
||||||
$params[] = $normalizedData[$paramName];
|
$params[] = $normalizedData[$paramName];
|
||||||
// don't run set for a parameter passed to the constructor
|
// don't run set for a parameter passed to the constructor
|
||||||
unset($normalizedData[$paramName]);
|
unset($normalizedData[$paramName]);
|
||||||
} elseif ($constructorParameter->isOptional()) {
|
} elseif ($constructorParameter->isDefaultValueAvailable()) {
|
||||||
$params[] = $constructorParameter->getDefaultValue();
|
$params[] = $constructorParameter->getDefaultValue();
|
||||||
} else {
|
} else {
|
||||||
throw new RuntimeException(
|
throw new RuntimeException(
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of the Symfony package.
|
||||||
|
*
|
||||||
|
* (c) Fabien Potencier <fabien@symfony.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Symfony\Component\Serializer\Tests\Fixtures;
|
||||||
|
|
||||||
|
class VariadicConstructorArgsDummy
|
||||||
|
{
|
||||||
|
private $foo;
|
||||||
|
|
||||||
|
public function __construct(...$foo)
|
||||||
|
{
|
||||||
|
$this->foo = $foo;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFoo()
|
||||||
|
{
|
||||||
|
return $this->foo;
|
||||||
|
}
|
||||||
|
}
|
@ -117,6 +117,28 @@ class GetSetMethodNormalizerTest extends \PHPUnit_Framework_TestCase
|
|||||||
$this->assertEquals(array(1, 2, 3), $obj->getBaz());
|
$this->assertEquals(array(1, 2, 3), $obj->getBaz());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 5.6
|
||||||
|
*/
|
||||||
|
public function testConstructorDenormalizeWithVariadicArgument()
|
||||||
|
{
|
||||||
|
$obj = $this->normalizer->denormalize(
|
||||||
|
array('foo' => array(1, 2, 3)),
|
||||||
|
'Symfony\Component\Serializer\Tests\Fixtures\VariadicConstructorArgsDummy', 'any');
|
||||||
|
$this->assertEquals(array(1, 2, 3), $obj->getFoo());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @requires PHP 5.6
|
||||||
|
*/
|
||||||
|
public function testConstructorDenormalizeWithMissingVariadicArgument()
|
||||||
|
{
|
||||||
|
$obj = $this->normalizer->denormalize(
|
||||||
|
array(),
|
||||||
|
'Symfony\Component\Serializer\Tests\Fixtures\VariadicConstructorArgsDummy', 'any');
|
||||||
|
$this->assertEquals(array(), $obj->getFoo());
|
||||||
|
}
|
||||||
|
|
||||||
public function testConstructorWithObjectDenormalize()
|
public function testConstructorWithObjectDenormalize()
|
||||||
{
|
{
|
||||||
$data = new \stdClass();
|
$data = new \stdClass();
|
||||||
|
Reference in New Issue
Block a user