Pull merge.
[yaffs-website] / vendor / symfony / serializer / Normalizer / ArrayDenormalizer.php
index 921e312bd0de9a89ffed5dcaf12a3d1b916f783b..23b3a0e95b023ebdeefd3339ebf1c0a17114a779 100644 (file)
@@ -13,6 +13,7 @@ namespace Symfony\Component\Serializer\Normalizer;
 
 use Symfony\Component\Serializer\Exception\BadMethodCallException;
 use Symfony\Component\Serializer\Exception\InvalidArgumentException;
+use Symfony\Component\Serializer\Exception\NotNormalizableValueException;
 use Symfony\Component\Serializer\SerializerAwareInterface;
 use Symfony\Component\Serializer\SerializerInterface;
 
@@ -20,6 +21,8 @@ use Symfony\Component\Serializer\SerializerInterface;
  * Denormalizes arrays of objects.
  *
  * @author Alexander M. Turek <me@derrabus.de>
+ *
+ * @final since version 3.3.
  */
 class ArrayDenormalizer implements DenormalizerInterface, SerializerAwareInterface
 {
@@ -30,37 +33,45 @@ class ArrayDenormalizer implements DenormalizerInterface, SerializerAwareInterfa
 
     /**
      * {@inheritdoc}
+     *
+     * @throws NotNormalizableValueException
      */
     public function denormalize($data, $class, $format = null, array $context = array())
     {
-        if ($this->serializer === null) {
+        if (null === $this->serializer) {
             throw new BadMethodCallException('Please set a serializer before calling denormalize()!');
         }
-        if (!is_array($data)) {
-            throw new InvalidArgumentException('Data expected to be an array, '.gettype($data).' given.');
+        if (!\is_array($data)) {
+            throw new InvalidArgumentException('Data expected to be an array, '.\gettype($data).' given.');
         }
-        if (substr($class, -2) !== '[]') {
+        if ('[]' !== substr($class, -2)) {
             throw new InvalidArgumentException('Unsupported class: '.$class);
         }
 
         $serializer = $this->serializer;
         $class = substr($class, 0, -2);
 
-        return array_map(
-            function ($data) use ($serializer, $class, $format, $context) {
-                return $serializer->denormalize($data, $class, $format, $context);
-            },
-            $data
-        );
+        $builtinType = isset($context['key_type']) ? $context['key_type']->getBuiltinType() : null;
+        foreach ($data as $key => $value) {
+            if (null !== $builtinType && !\call_user_func('is_'.$builtinType, $key)) {
+                throw new NotNormalizableValueException(sprintf('The type of the key "%s" must be "%s" ("%s" given).', $key, $builtinType, \gettype($key)));
+            }
+
+            $data[$key] = $serializer->denormalize($value, $class, $format, $context);
+        }
+
+        return $data;
     }
 
     /**
      * {@inheritdoc}
      */
-    public function supportsDenormalization($data, $type, $format = null)
+    public function supportsDenormalization($data, $type, $format = null/*, array $context = array()*/)
     {
-        return substr($type, -2) === '[]'
-            && $this->serializer->supportsDenormalization($data, substr($type, 0, -2), $format);
+        $context = \func_num_args() > 3 ? func_get_arg(3) : array();
+
+        return '[]' === substr($type, -2)
+            && $this->serializer->supportsDenormalization($data, substr($type, 0, -2), $format, $context);
     }
 
     /**