8000 [Serializer] Object class resolver · symfony/symfony@18d2143 · GitHub
[go: up one dir, main page]

Skip to content

Commit 18d2143

Browse files
alanpoulaindunglas
authored andcommitted
[Serializer] Object class resolver
1 parent 9610d10 commit 18d2143

File tree

3 files changed

+9
-5
lines changed

3 files changed

+9
-5
lines changed

src/Symfony/Component/Serializer/CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ CHANGELOG
1919
either `NormalizerInterface` or `DenormalizerInterface`
2020
* deprecated creating a `Serializer` with encoders which do not implement
2121
either `EncoderInterface` or `DecoderInterface`
22+
* added the optional `$objectClassResolver` argument in `AbstractObjectNormalizer`
23+
and `ObjectNormalizer` constructor
2224

2325
4.1.0
2426
-----

src/Symfony/Component/Serializer/Normalizer/AbstractObjectNormalizer.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,13 +44,14 @@ abstract class AbstractObjectNormalizer extends AbstractNormalizer
4444
* @var callable|null
4545
*/
4646
private $maxDepthHandler;
47+
private $objectClassResolver;
4748

4849
/**
4950
* @var ClassDiscriminatorResolverInterface|null
5051
*/
5152
protected $classDiscriminatorResolver;
5253

53-
public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null)
54+
public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null)
5455
{
5556
parent::__construct($classMetadataFactory, $nameConverter);
5657

@@ -60,6 +61,7 @@ public function __construct(ClassMetadataFactoryInterface $classMetadataFactory
6061
$classDiscriminatorResolver = new ClassDiscriminatorFromClassMetadata($classMetadataFactory);
6162
}
6263
$this->classDiscriminatorResolver = $classDiscriminatorResolver;
64+
$this->objectClassResolver = $objectClassResolver;
6365
}
6466

6567
/**
@@ -86,7 +88,7 @@ public function normalize($object, $format = null, array $context = array())
8688
$data = array();
8789
$stack = array();
8890
$attributes = $this->getAttributes($object, $format, $context);
89-
$class = \get_class($object);
91+
$class = $this->objectClassResolver ? \call_user_func($this->objectClassResolver, $object) : \get_class($object);
9092
$attributesMetadata = $this->classMetadataFactory ? $this->classMetadataFactory->getMetadataFor($class)->getAttributesMetadata() : null;
9193

9294
foreach ($attributes as $attribute) {
@@ -155,7 +157,7 @@ protected function instantiateObject(array &$data, $class, array &$context, \Ref
155157
*/
156158
protected function getAttributes($object, $format = null, array $context)
157159
{
158-
$class = \get_class($object);
160+
$class = $this->objectClassResolver ? \call_user_func($this->objectClassResolver, $object) : \get_class($object);
159161
$key = $class.'-'.$context['cache_key'];
160162

161163
if (isset($this->attributesCache[$key])) {

src/Symfony/Component/Serializer/Normalizer/ObjectNormalizer.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,13 +30,13 @@ class ObjectNormalizer extends AbstractObjectNormalizer
3030
{
3131
protected $propertyAccessor;
3232

33-
public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null)
33+
public function __construct(ClassMetadataFactoryInterface $classMetadataFactory = null, NameConverterInterface $nameConverter = null, PropertyAccessorInterface $propertyAccessor = null, PropertyTypeExtractorInterface $propertyTypeExtractor = null, ClassDiscriminatorResolverInterface $classDiscriminatorResolver = null, callable $objectClassResolver = null)
3434
{
3535
if (!\class_exists(PropertyAccess::class)) {
3636
throw new LogicException('The ObjectNormalizer class requires the "PropertyAccess" component. Install "symfony/property-access" to use it.');
3737
}
3838

39-
parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver);
39+
parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver, $objectClassResolver);
4040

4141
$this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
4242
}

0 commit comments

Comments
 (0)
0