From 959ac2a6b2089aecc091cc9267f58ea9562cc2f8 Mon Sep 17 00:00:00 2001 From: Maxime Steinhausser Date: Wed, 5 Jul 2017 11:12:59 +0200 Subject: [PATCH] [Serializer] AbstractObjectNormalizer: Allow to disable type enforcement --- src/Symfony/Component/Serializer/CHANGELOG.md | 6 ++++++ .../Serializer/Normalizer/AbstractObjectNormalizer.php | 5 +++++ .../Tests/Normalizer/ObjectNormalizerTest.php | 10 ++++++++++ 3 files changed, 21 insertions(+) diff --git a/src/Symfony/Component/Serializer/CHANGELOG.md b/src/Symfony/Component/Serializer/CHANGELOG.md index ef5ed7953807..2e10bd469bab 100644 --- a/src/Symfony/Component/Serializer/CHANGELOG.md +++ b/src/Symfony/Component/Serializer/CHANGELOG.md @@ -1,6 +1,12 @@ CHANGELOG ========= +3.4.0 +----- + + * added `AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT` context option + to disable throwing an `UnexpectedValueException` on a type mismatch + 3.3.0 ----- diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index 4e4b99245da3..d9174b949b48 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -33,6 +33,7 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer const ENABLE_MAX_DEPTH = 'enable_max_depth'; const DEPTH_KEY_PATTERN = 'depth_%s::%s'; const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes'; + const DISABLE_TYPE_ENFORCEMENT = 'disable_type_enforcement'; private $propertyTypeExtractor; private $attributesCache = array(); @@ -289,6 +290,10 @@ private function validateAndDenormalize($currentClass, $attribute, $data, $forma } } + if (isset($context[self::DISABLE_TYPE_ENFORCEMENT]) && $context[self::DISABLE_TYPE_ENFORCEMENT]) { + return $data; + } + throw new UnexpectedValueException(sprintf('The type of the "%s" attribute for class "%s" must be one of "%s" ("%s" given).', $attribute, $currentClass, implode('", "', array_keys($expectedTypes)), gettype($data))); } diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php index b2d7b872f4d9..f10937bd9c3a 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/ObjectNormalizerTest.php @@ -628,6 +628,16 @@ public function testRejectInvalidKey() $serializer->denormalize(array('inners' => array('a' => array('foo' => 1))), ObjectOuter::class); } + public function testDoNotRejectInvalidTypeOnDisableTypeEnforcementContextOption() + { + $extractor = new PropertyInfoExtractor(array(), array(new PhpDocExtractor())); + $normalizer = new ObjectNormalizer(null, null, null, $extractor); + $serializer = new Serializer(array($normalizer)); + $context = array(ObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true); + + $this->assertSame('foo', $serializer->denormalize(array('number' => 'foo'), JsonNumber::class, null, $context)->number); + } + public function testExtractAttributesRespectsFormat() { $normalizer = new FormatAndContextAwareNormalizer();