From 18d21439e0842dfe41ea1699d786caad165799e9 Mon Sep 17 00:00:00 2001 From: Alan Poulain Date: Sun, 30 Sep 2018 16:17:59 +0200 Subject: [PATCH] [Serializer] Object class resolver --- src/Symfony/Component/Serializer/CHANGELOG.md | 2 ++ .../Serializer/Normalizer/AbstractObjectNormalizer.php | 8 +++++--- .../Component/Serializer/Normalizer/ObjectNormalizer.php | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Symfony/Component/Serializer/CHANGELOG.md b/src/Symfony/Component/Serializer/CHANGELOG.md index 65f413625e62f..fc19ef9ff8be1 100644 --- a/src/Symfony/Component/Serializer/CHANGELOG.md +++ b/src/Symfony/Component/Serializer/CHANGELOG.md @@ -19,6 +19,8 @@ CHANGELOG either `NormalizerInterface` or `DenormalizerInterface` * deprecated creating a `Serializer` with encoders which do not implement either `EncoderInterface` or `DecoderInterface` + * added the optional `$objectClassResolver` argument in `AbstractObjectNormalizer` + and `ObjectNormalizer` constructor 4.1.0 ----- diff --git a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php index aaf047a32398a..3587d2d83b505 100644 --- a/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php @@ -44,13 +44,14 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer * @var callable|null */ private $maxDepthHandler; + private $objectClassResolver; /** * @var ClassDiscriminatorResolverInterface|null */ protected $classDiscriminatorResolver; - public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null) + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null) { parent::__construct($classMetadataFactory, $nameConverter); @@ -60,6 +61,7 @@ public function __construct(ClassMetadataFactoryInterface $classMetadataFactory $classDiscriminatorResolver = new ClassDiscriminatorFromClassMetadata($classMetadataFactory); } $this->classDiscriminatorResolver = $classDiscriminatorResolver; + $this->objectClassResolver = $objectClassResolver; } /** @@ -86,7 +88,7 @@ public function normalize($object, $format = null, array $context = array()) $data = array(); $stack = array(); $attributes = $this->getAttributes($object, $format, $context); - $class = \get_class($object); + $class = $this->objectClassResolver ? \call_user_func($this->objectClassResolver, $object) : \get_class($object); $attributesMetadata = $this->classMetadataFactory ? $this->classMetadataFactory->getMetadataFor($class)->getAttributesMetadata() : null; foreach ($attributes as $attribute) { @@ -155,7 +157,7 @@ protected function instantiateObject(array &$data, $class, array &$context, \Ref */ protected function getAttributes($object, $format = null, array $context) { - $class = \get_class($object); + $class = $this->objectClassResolver ? \call_user_func($this->objectClassResolver, $object) : \get_class($object); $key = $class.'-'.$context['cache_key']; if (isset($this->attributesCache[$key])) { diff --git a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php index 5de0687789360..a6ea398e6265d 100644 --- a/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php +++ b/src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php @@ -30,13 +30,13 @@ class ObjectNormalizer extends AbstractObjectNormalizer { protected $propertyAccessor; - public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null) + public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null) { if (!\class_exists(PropertyAccess::class)) { throw new LogicException('The ObjectNormalizer class requires the "PropertyAccess" component. Install "symfony/property-access" to use it.'); } - parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver); + parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver, $objectClassResolver); $this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor(); }