diff vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php @ 18:af1871eacc83

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:33:08 +0100
parents 129ea1e6d783
children
line wrap: on
line diff
--- a/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php	Thu Feb 28 13:21:36 2019 +0000
+++ b/vendor/symfony/serializer/Normalizer/AbstractObjectNormalizer.php	Thu May 09 15:33:08 2019 +0100
@@ -94,7 +94,7 @@
                 throw new LogicException(sprintf('Cannot normalize attribute "%s" because the injected serializer is not a normalizer', $attribute));
             }
 
-            $data = $this->updateData($data, $attribute, $this->serializer->normalize($attributeValue, $format, $this->createChildContext($context, $attribute)));
+            $data = $this->updateData($data, $attribute, $this->serializer->normalize($attributeValue, $format, $this->createChildContext($context, $attribute, $format)));
         }
 
         return $data;
@@ -128,15 +128,13 @@
             return $allowedAttributes;
         }
 
-        if (isset($context['attributes'])) {
-            return $this->extractAttributes($object, $format, $context);
+        $attributes = $this->extractAttributes($object, $format, $context);
+
+        if ($context['cache_key']) {
+            $this->attributesCache[$key] = $attributes;
         }
 
-        if (isset($this->attributesCache[$class])) {
-            return $this->attributesCache[$class];
-        }
-
-        return $this->attributesCache[$class] = $this->extractAttributes($object, $format, $context);
+        return $attributes;
     }
 
     /**
@@ -276,7 +274,7 @@
                     throw new LogicException(sprintf('Cannot denormalize attribute "%s" for class "%s" because injected serializer is not a denormalizer', $attribute, $class));
                 }
 
-                $childContext = $this->createChildContext($context, $attribute);
+                $childContext = $this->createChildContext($context, $attribute, $format);
                 if ($this->serializer->supportsDenormalization($data, $class, $format, $childContext)) {
                     return $this->serializer->denormalize($data, $class, $format, $childContext);
                 }
@@ -373,7 +371,32 @@
     }
 
     /**
-     * Gets the cache key to use.
+     * Overwritten to update the cache key for the child.
+     *
+     * We must not mix up the attribute cache between parent and children.
+     *
+     * {@inheritdoc}
+     */
+    protected function createChildContext(array $parentContext, $attribute/*, string $format = null */)
+    {
+        if (\func_num_args() >= 3) {
+            $format = \func_get_arg(2);
+        } else {
+            // will be deprecated in version 4
+            $format = null;
+        }
+
+        $context = parent::createChildContext($parentContext, $attribute, $format);
+        // format is already included in the cache_key of the parent.
+        $context['cache_key'] = $this->getCacheKey($format, $context);
+
+        return $context;
+    }
+
+    /**
+     * Builds the cache key for the attributes cache.
+     *
+     * The key must be different for every option in the context that could change which attributes should be handled.
      *
      * @param string|null $format
      * @param array       $context
@@ -382,8 +405,13 @@
      */
     private function getCacheKey($format, array $context)
     {
+        unset($context['cache_key']); // avoid artificially different keys
         try {
-            return md5($format.serialize($context));
+            return md5($format.serialize([
+                'context' => $context,
+                'ignored' => $this->ignoredAttributes,
+                'camelized' => $this->camelizedAttributes,
+            ]));
         } catch (\Exception $exception) {
             // The context cannot be serialized, skip the cache
             return false;