8000 bug #58306 [Serializer] Collect denormalization errors for variadic p… · devloop42/symfony@2de4387 · GitHub
[go: up one dir, main page]

Skip to content

Commit 2de4387

Browse files
bug symfony#58306 [Serializer] Collect denormalization errors for variadic params (mtarld)
This PR was merged into the 6.4 branch. Discussion ---------- [Serializer] Collect denormalization errors for variadic params | Q | A | ------------- | --- | Branch? | 6.4 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | Fix symfony#58281 | License | MIT Wrap variadic parameters denormalization in a try/catch to collect denormalization errors. Commits ------- cdb2e6e [Serializer] Catch `NotNormalizableValueException` for variadic parameters
2 parents 3e6a96d + cdb2e6e commit 2de4387

File tree

3 files changed

+49
-1
lines changed

3 files changed

+49
-1
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,16 @@ protected function instantiateObject(array &$data, string $class, array &$contex
358358

359359
$variadicParameters = [];
360360
foreach ($data[$key] as $parameterKey => $parameterData) {
361-
$variadicParameters[$parameterKey] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $attributeContext, $format);
361+
try {
362+
$variadicParameters[$parameterKey] = $this->denormalizeParameter($reflectionClass, $constructorParameter, $paramName, $parameterData, $attributeContext, $format);
363+
} catch (NotNormalizableValueException $exception) {
364+
if (!isset($context['not_normalizable_value_exceptions'])) {
365+
throw $exception;
366+
}
367+
368+
$context['not_normalizable_value_exceptions'][] = $exception;
369+
$params[$paramName] = $parameterData;
370+
}
362371
}
363372

364373
$params = array_merge(array_values($params), $variadicParameters);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\Serializer\Tests\Fixtures;
13+
14+
use Symfony\Component\Uid\Uuid;
15+
16+
class DummyWithVariadicParameter
17+
{
18+
public array $variadic;
19+
20+
public function __construct(Uuid ...$variadic)
21+
{
22+
$this->variadic = $variadic;
23+
}
24+
}

src/Symfony/Component/Serializer/Tests/SerializerTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@
6161
use Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumConstructor;
6262
use Symfony\Component\Serializer\Tests\Fixtures\DummyObjectWithEnumProperty;
6363
use Symfony\Component\Serializer\Tests\Fixtures\DummyWithObjectOrNull;
64+
use Symfony\Component\Serializer\Tests\Fixtures\DummyWithVariadicParameter;
65+
use Symfony\Component\Serializer\Tests\Fixtures\DummyWithVariadicProperty;
6466
use Symfony\Component\Serializer\Tests\Fixtures\FalseBuiltInDummy;
6567
use Symfony\Component\Serializer\Tests\Fixtures\FooImplementationDummy;
6668
use Symfony\Component\Serializer\Tests\Fixtures\FooInterfaceDummyDenormalizer;
@@ -1637,6 +1639,19 @@ public function testPartialDenormalizationWithMissingConstructorTypes()
16371639

16381640
$this->assertSame($expected, $exceptionsAsArray);
16391641
}
1642+
1643+
public function testPartialDenormalizationWithInvalidVariadicParameter()
1644+
{
1645+
$json = '{"variadic": ["a random string"]}';
1646+
1647+
$serializer = new Serializer([new UidNormalizer(), new ObjectNormalizer()], ['json' => new JsonEncoder()]);
1648+
1649+
$this->expectException(PartialDenormalizationException::class);
1650+
1651+
$serializer->deserialize($json, DummyWithVariadicParameter::class, 'json', [
1652+
DenormalizerInterface::COLLECT_DENORMALIZATION_ERRORS => true,
1653+
]);
1654+
}
16401655
}
16411656

16421657
class Model

0 commit comments

Comments
 (0)
0