Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf03696e

Browse files
committed
[Serializer] Add support for discriminator map in property normalizer
Fixes#60214Currently it's not possible to serialize an object using the PropertyNormalizer when aDiscriminatorMap attribute is used.It produces the following error:> Symfony\Component\Serializer\Exception\NotNormalizableValueException: Type property "type" not found> for the abstract object "Symfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface".The ObjectNormalizer overrides the `getAllowedAttributes` from AbstractNormalizer and adds support fordiscriminators. But the PropertyNormalizer does not do this. Therefore it doesn't work.For now, we copy the logic from ObjectNormalizer to PropertyNormalizer and the problem goes away.
1 parent92f7862 commitf03696e

File tree

5 files changed

+77
-24
lines changed

5 files changed

+77
-24
lines changed

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

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
useSymfony\Component\Serializer\Exception\LogicException;
2626
useSymfony\Component\Serializer\Exception\MissingConstructorArgumentsException;
2727
useSymfony\Component\Serializer\Exception\NotNormalizableValueException;
28+
useSymfony\Component\Serializer\Mapping\AttributeMetadata;
2829
useSymfony\Component\Serializer\Mapping\AttributeMetadataInterface;
2930
useSymfony\Component\Serializer\Mapping\ClassDiscriminatorFromClassMetadata;
3031
useSymfony\Component\Serializer\Mapping\ClassDiscriminatorResolverInterface;
@@ -765,6 +766,30 @@ protected function createChildContext(array $parentContext, string $attribute, ?
765766
return$context;
766767
}
767768

769+
protectedfunctiongetAllowedAttributes(string|object$classOrObject,array$context,bool$attributesAsString =false):array|bool
770+
{
771+
if (false ===$allowedAttributes =parent::getAllowedAttributes($classOrObject,$context,$attributesAsString)) {
772+
returnfalse;
773+
}
774+
775+
if (null !==$this->classDiscriminatorResolver) {
776+
$class =\is_object($classOrObject) ?$classOrObject::class :$classOrObject;
777+
if (null !==$discriminatorMapping =$this->classDiscriminatorResolver->getMappingForMappedObject($classOrObject)) {
778+
$allowedAttributes[] =$attributesAsString ?$discriminatorMapping->getTypeProperty() :newAttributeMetadata($discriminatorMapping->getTypeProperty());
779+
}
780+
781+
if (null !==$discriminatorMapping =$this->classDiscriminatorResolver->getMappingForClass($class)) {
782+
$attributes = [];
783+
foreach ($discriminatorMapping->getTypesMapping()as$mappedClass) {
784+
$attributes[] =parent::getAllowedAttributes($mappedClass,$context,$attributesAsString);
785+
}
786+
$allowedAttributes =array_merge($allowedAttributes, ...$attributes);
787+
}
788+
}
789+
790+
return$allowedAttributes;
791+
}
792+
768793
/**
769794
* Builds the cache key for the attributes cache.
770795
*

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

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -164,30 +164,6 @@ protected function setAttributeValue(object $object, string $attribute, mixed $v
164164
}
165165
}
166166

167-
protectedfunctiongetAllowedAttributes(string|object$classOrObject,array$context,bool$attributesAsString =false):array|bool
168-
{
169-
if (false ===$allowedAttributes =parent::getAllowedAttributes($classOrObject,$context,$attributesAsString)) {
170-
returnfalse;
171-
}
172-
173-
if (null !==$this->classDiscriminatorResolver) {
174-
$class =\is_object($classOrObject) ?$classOrObject::class :$classOrObject;
175-
if (null !==$discriminatorMapping =$this->classDiscriminatorResolver->getMappingForMappedObject($classOrObject)) {
176-
$allowedAttributes[] =$attributesAsString ?$discriminatorMapping->getTypeProperty() :newAttributeMetadata($discriminatorMapping->getTypeProperty());
177-
}
178-
179-
if (null !==$discriminatorMapping =$this->classDiscriminatorResolver->getMappingForClass($class)) {
180-
$attributes = [];
181-
foreach ($discriminatorMapping->getTypesMapping()as$mappedClass) {
182-
$attributes[] =parent::getAllowedAttributes($mappedClass,$context,$attributesAsString);
183-
}
184-
$allowedAttributes =array_merge($allowedAttributes, ...$attributes);
185-
}
186-
}
187-
188-
return$allowedAttributes;
189-
}
190-
191167
protectedfunctionisAllowedAttribute($classOrObject,string$attribute, ?string$format =null,array$context = [])
192168
{
193169
if (!parent::isAllowedAttribute($classOrObject,$attribute,$format,$context)) {

‎src/Symfony/Component/Serializer/Tests/Fixtures/DummyMessageInterface.php‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
'one' => DummyMessageNumberOne::class,
2121
'two' => DummyMessageNumberTwo::class,
2222
'three' => DummyMessageNumberThree::class,
23+
'four' => DummyMessageNumberFour::class,
2324
])]
2425
interface DummyMessageInterface
2526
{
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespaceSymfony\Component\Serializer\Tests\Fixtures;
13+
14+
useSymfony\Component\Serializer\Attribute\Ignore;
15+
16+
abstractclass SomeAbstract {
17+
#[Ignore]
18+
publicfunctiongetDescription()
19+
{
20+
return'Hello, World!';
21+
}
22+
}
23+
24+
class DummyMessageNumberFourextends SomeAbstractimplements DummyMessageInterface
25+
{
26+
publicfunction__construct(public$one)
27+
{
28+
}
29+
}

‎src/Symfony/Component/Serializer/Tests/Normalizer/AbstractObjectNormalizerTest.php‎

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,16 @@
4242
useSymfony\Component\Serializer\Normalizer\DateTimeNormalizer;
4343
useSymfony\Component\Serializer\Normalizer\DenormalizerInterface;
4444
useSymfony\Component\Serializer\Normalizer\ObjectNormalizer;
45+
useSymfony\Component\Serializer\Normalizer\PropertyNormalizer;
4546
useSymfony\Component\Serializer\Serializer;
4647
useSymfony\Component\Serializer\SerializerAwareInterface;
4748
useSymfony\Component\Serializer\SerializerInterface;
4849
useSymfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummy;
4950
useSymfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummyFirstChild;
5051
useSymfony\Component\Serializer\Tests\Fixtures\Attributes\AbstractDummySecondChild;
5152
useSymfony\Component\Serializer\Tests\Fixtures\DummyFirstChildQuux;
53+
useSymfony\Component\Serializer\Tests\Fixtures\DummyMessageInterface;
54+
useSymfony\Component\Serializer\Tests\Fixtures\DummyMessageNumberFour;
5255
useSymfony\Component\Serializer\Tests\Fixtures\DummySecondChildQuux;
5356
useSymfony\Component\Serializer\Tests\Fixtures\DummyString;
5457
useSymfony\Component\Serializer\Tests\Fixtures\DummyWithNotNormalizable;
@@ -1087,6 +1090,25 @@ public static function provideBooleanTypesData()
10871090
[['foo' =>false], TruePropertyDummy::class],
10881091
];
10891092
}
1093+
1094+
publicfunctiontestDeserializeAndSerializeConstructorAndIgnoreAndInterfacedObjectsWithTheClassMetadataDiscriminator()
1095+
{
1096+
$example =newDummyMessageNumberFour('Hello');
1097+
1098+
$classMetadataFactory =newClassMetadataFactory(newAttributeLoader());
1099+
1100+
$normalizer =newPropertyNormalizer(
1101+
$classMetadataFactory,
1102+
null,
1103+
newPropertyInfoExtractor([], [newPhpDocExtractor(),newReflectionExtractor()]),
1104+
newClassDiscriminatorFromClassMetadata($classMetadataFactory),
1105+
);
1106+
1107+
$serialized =$normalizer->normalize($example,'json');
1108+
$deserialized =$normalizer->denormalize($serialized, DummyMessageInterface::class,'json');
1109+
1110+
$this->assertEquals($example,$deserialized);
1111+
}
10901112
}
10911113

10921114
class AbstractObjectNormalizerDummyextends AbstractObjectNormalizer

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp