[Serializer] Add default object class resolver
This commit is contained in:
parent
75b1157633
commit
dd5b8f16f5
@ -43,7 +43,10 @@ class ObjectNormalizer extends AbstractObjectNormalizer
|
||||
parent::__construct($classMetadataFactory, $nameConverter, $propertyTypeExtractor, $classDiscriminatorResolver, $objectClassResolver, $defaultContext);
|
||||
|
||||
$this->propertyAccessor = $propertyAccessor ?: PropertyAccess::createPropertyAccessor();
|
||||
$this->objectClassResolver = $objectClassResolver;
|
||||
|
||||
$this->objectClassResolver = $objectClassResolver ?? function ($class) {
|
||||
return \is_object($class) ? \get_class($class) : $class;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
@ -63,7 +66,7 @@ class ObjectNormalizer extends AbstractObjectNormalizer
|
||||
$attributes = [];
|
||||
|
||||
// methods
|
||||
$class = $this->objectClassResolver ? ($this->objectClassResolver)($object) : \get_class($object);
|
||||
$class = ($this->objectClassResolver)($object);
|
||||
$reflClass = new \ReflectionClass($class);
|
||||
|
||||
foreach ($reflClass->getMethods(\ReflectionMethod::IS_PUBLIC) as $reflMethod) {
|
||||
|
@ -1043,6 +1043,30 @@ class ObjectNormalizerTest extends TestCase
|
||||
$this->assertArrayHasKey('foo-Symfony\Component\Serializer\Tests\Normalizer\ObjectDummy-json-bar', $normalizer->normalize(new ObjectDummy(), 'json', ['foo' => 'bar']));
|
||||
}
|
||||
|
||||
public function testDefaultObjectClassResolver()
|
||||
{
|
||||
$normalizer = new ObjectNormalizer();
|
||||
|
||||
$obj = new ObjectDummy();
|
||||
$obj->setFoo('foo');
|
||||
$obj->bar = 'bar';
|
||||
$obj->setBaz(true);
|
||||
$obj->setCamelCase('camelcase');
|
||||
$obj->unwantedProperty = 'notwanted';
|
||||
|
||||
$this->assertEquals(
|
||||
[
|
||||
'foo' => 'foo',
|
||||
'bar' => 'bar',
|
||||
'baz' => true,
|
||||
'fooBar' => 'foobar',
|
||||
'camelCase' => 'camelcase',
|
||||
'object' => null,
|
||||
],
|
||||
$normalizer->normalize($obj, 'any')
|
||||
);
|
||||
}
|
||||
|
||||
public function testObjectClassResolver()
|
||||
{
|
||||
$classResolver = function ($object) {
|
||||
|
Reference in New Issue
Block a user