X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FAbstractNormalizer.php;fp=vendor%2Fsymfony%2Fserializer%2FNormalizer%2FAbstractNormalizer.php;h=74a133214f55bbd034a66efe46229f50ca74dc6a;hp=d624b8f455c61d8cee0dcbdc2ff6267a932b64aa;hb=af6d1fb995500ae68849458ee10d66abbdcfb252;hpb=680c79a86e3ed402f263faeac92e89fb6d9edcc0 diff --git a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php index d624b8f45..74a133214 100644 --- a/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php +++ b/vendor/symfony/serializer/Normalizer/AbstractNormalizer.php @@ -27,9 +27,13 @@ use Symfony\Component\Serializer\SerializerAwareInterface; */ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements NormalizerInterface, DenormalizerInterface, SerializerAwareInterface { + use ObjectToPopulateTrait; + const CIRCULAR_REFERENCE_LIMIT = 'circular_reference_limit'; const OBJECT_TO_POPULATE = 'object_to_populate'; const GROUPS = 'groups'; + const ATTRIBUTES = 'attributes'; + const ALLOW_EXTRA_ATTRIBUTES = 'allow_extra_attributes'; /** * @var int @@ -68,9 +72,6 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N /** * Sets the {@link ClassMetadataFactoryInterface} to use. - * - * @param ClassMetadataFactoryInterface|null $classMetadataFactory - * @param NameConverterInterface|null $nameConverter */ public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null) { @@ -81,7 +82,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N /** * Set circular reference limit. * - * @param int $circularReferenceLimit limit of iterations for the same object + * @param int $circularReferenceLimit Limit of iterations for the same object * * @return self */ @@ -109,7 +110,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N /** * Set normalization callbacks. * - * @param callable[] $callbacks help normalize the result + * @param callable[] $callbacks Help normalize the result * * @return self * @@ -118,7 +119,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N public function setCallbacks(array $callbacks) { foreach ($callbacks as $attribute => $callback) { - if (!is_callable($callback)) { + if (!\is_callable($callback)) { throw new InvalidArgumentException(sprintf( 'The given callback for attribute "%s" is not callable.', $attribute @@ -133,8 +134,6 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N /** * Set ignored attributes for normalization and denormalization. * - * @param array $ignoredAttributes - * * @return self */ public function setIgnoredAttributes(array $ignoredAttributes) @@ -188,10 +187,10 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N protected function handleCircularReference($object) { if ($this->circularReferenceHandler) { - return call_user_func($this->circularReferenceHandler, $object); + return \call_user_func($this->circularReferenceHandler, $object); } - throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d)', get_class($object), $this->circularReferenceLimit)); + throw new CircularReferenceException(sprintf('A circular reference has been detected when serializing the object of class "%s" (configured limit: %d)', \get_class($object), $this->circularReferenceLimit)); } /** @@ -205,7 +204,14 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N */ protected function getAllowedAttributes($classOrObject, array $context, $attributesAsString = false) { - if (!$this->classMetadataFactory || !isset($context[static::GROUPS]) || !is_array($context[static::GROUPS])) { + if (!$this->classMetadataFactory) { + return false; + } + + $groups = false; + if (isset($context[static::GROUPS]) && \is_array($context[static::GROUPS])) { + $groups = $context[static::GROUPS]; + } elseif (!isset($context[static::ALLOW_EXTRA_ATTRIBUTES]) || $context[static::ALLOW_EXTRA_ATTRIBUTES]) { return false; } @@ -214,7 +220,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N $name = $attributeMetadata->getName(); if ( - count(array_intersect($attributeMetadata->getGroups(), $context[static::GROUPS])) && + (false === $groups || array_intersect($attributeMetadata->getGroups(), $groups)) && $this->isAllowedAttribute($classOrObject, $name, null, $context) ) { $allowedAttributes[] = $attributesAsString ? $name : $attributeMetadata; @@ -236,7 +242,20 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N */ protected function isAllowedAttribute($classOrObject, $attribute, $format = null, array $context = array()) { - return !in_array($attribute, $this->ignoredAttributes); + if (in_array($attribute, $this->ignoredAttributes)) { + return false; + } + + if (isset($context[self::ATTRIBUTES][$attribute])) { + // Nested attributes + return true; + } + + if (isset($context[self::ATTRIBUTES]) && is_array($context[self::ATTRIBUTES])) { + return in_array($attribute, $context[self::ATTRIBUTES], true); + } + + return true; } /** @@ -288,27 +307,22 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N * * @throws RuntimeException */ - protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes/*, $format = null*/) + protected function instantiateObject(array &$data, $class, array &$context, \ReflectionClass $reflectionClass, $allowedAttributes/*, string $format = null*/) { - if (func_num_args() >= 6) { - $format = func_get_arg(5); + if (\func_num_args() >= 6) { + $format = \func_get_arg(5); } else { - if (__CLASS__ !== get_class($this)) { + if (__CLASS__ !== \get_class($this)) { $r = new \ReflectionMethod($this, __FUNCTION__); if (__CLASS__ !== $r->getDeclaringClass()->getName()) { - @trigger_error(sprintf('Method %s::%s() will have a 6th `$format = null` argument in version 4.0. Not defining it is deprecated since 3.2.', get_class($this), __FUNCTION__), E_USER_DEPRECATED); + @trigger_error(sprintf('Method %s::%s() will have a 6th `string $format = null` argument in version 4.0. Not defining it is deprecated since Symfony 3.2.', get_class($this), __FUNCTION__), E_USER_DEPRECATED); } } $format = null; } - if ( - isset($context[static::OBJECT_TO_POPULATE]) && - is_object($context[static::OBJECT_TO_POPULATE]) && - $context[static::OBJECT_TO_POPULATE] instanceof $class - ) { - $object = $context[static::OBJECT_TO_POPULATE]; + if (null !== $object = $this->extractObjectToPopulate($class, $context, static::OBJECT_TO_POPULATE)) { unset($context[static::OBJECT_TO_POPULATE]); return $object; @@ -323,11 +337,11 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N $paramName = $constructorParameter->name; $key = $this->nameConverter ? $this->nameConverter->normalize($paramName) : $paramName; - $allowed = $allowedAttributes === false || in_array($paramName, $allowedAttributes); - $ignored = in_array($paramName, $this->ignoredAttributes); + $allowed = false === $allowedAttributes || \in_array($paramName, $allowedAttributes); + $ignored = !$this->isAllowedAttribute($class, $paramName, $format, $context); if (method_exists($constructorParameter, 'isVariadic') && $constructorParameter->isVariadic()) { if ($allowed && !$ignored && (isset($data[$key]) || array_key_exists($key, $data))) { - if (!is_array($data[$paramName])) { + if (!\is_array($data[$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)); } @@ -341,7 +355,7 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N throw new LogicException(sprintf('Cannot create an instance of %s from serialized data because the serializer inject in "%s" is not a denormalizer', $constructorParameter->getClass(), static::class)); } $parameterClass = $constructorParameter->getClass()->getName(); - $parameterData = $this->serializer->denormalize($parameterData, $parameterClass, $format, $context); + $parameterData = $this->serializer->denormalize($parameterData, $parameterClass, $format, $this->createChildContext($context, $paramName)); } } catch (\ReflectionException $e) { throw new RuntimeException(sprintf('Could not determine the class of the parameter "%s".', $key), 0, $e); @@ -372,4 +386,23 @@ abstract class AbstractNormalizer extends SerializerAwareNormalizer implements N return new $class(); } + + /** + * @param array $parentContext + * @param string $attribute + * + * @return array + * + * @internal + */ + protected function createChildContext(array $parentContext, $attribute) + { + if (isset($parentContext[self::ATTRIBUTES][$attribute])) { + $parentContext[self::ATTRIBUTES] = $parentContext[self::ATTRIBUTES][$attribute]; + } else { + unset($parentContext[self::ATTRIBUTES]); + } + + return $parentContext; + } }