From 3407c350e14c3435b68bb63ccd399fb5c9385c58 Mon Sep 17 00:00:00 2001 From: Alexander Onatskiy Date: Tue, 28 Sep 2021 11:18:29 +0300 Subject: [PATCH] [Serializer] Attributes that extends the serializer`s annotations do not ignore by the serialization process --- .../Mapping/Loader/AnnotationLoader.php | 25 +++++++++++++------ .../Tests/Fixtures/Annotations/GroupDummy.php | 16 ++++++++++++ .../Tests/Fixtures/Attributes/GroupDummy.php | 13 ++++++++++ .../Fixtures/ChildOfGroupsAnnotationDummy.php | 18 +++++++++++++ .../Mapping/TestClassMetadataFactory.php | 4 +++ .../Normalizer/PropertyNormalizerTest.php | 3 ++- 6 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 src/Symfony/Component/Serializer/Tests/Fixtures/ChildOfGroupsAnnotationDummy.php diff --git a/src/Symfony/Component/Serializer/Mapping/Loader/AnnotationLoader.php b/src/Symfony/Component/Serializer/Mapping/Loader/AnnotationLoader.php index bd0f049c729f1..ebe8eefae7881 100644 --- a/src/Symfony/Component/Serializer/Mapping/Loader/AnnotationLoader.php +++ b/src/Symfony/Component/Serializer/Mapping/Loader/AnnotationLoader.php @@ -33,12 +33,12 @@ class AnnotationLoader implements LoaderInterface { private const KNOWN_ANNOTATIONS = [ - DiscriminatorMap::class => true, - Groups::class => true, - Ignore::class => true, - MaxDepth::class => true, - SerializedName::class => true, - Context::class => true, + DiscriminatorMap::class, + Groups::class, + Ignore::class, + MaxDepth::class, + SerializedName::class, + Context::class, ]; private $reader; @@ -157,7 +157,7 @@ public function loadAnnotations(object $reflector): iterable { if (\PHP_VERSION_ID >= 80000) { foreach ($reflector->getAttributes() as $attribute) { - if (self::KNOWN_ANNOTATIONS[$attribute->getName()] ?? false) { + if ($this->isKnownAttribute($attribute->getName())) { yield $attribute->newInstance(); } } @@ -193,4 +193,15 @@ private function setAttributeContextsForGroups(Context $annotation, AttributeMet $attributeMetadata->setDenormalizationContextForGroups($annotation->getDenormalizationContext(), $annotation->getGroups()); } } + + private function isKnownAttribute(string $attributeName): bool + { + foreach (self::KNOWN_ANNOTATIONS as $knownAnnotation) { + if (is_a($attributeName, $knownAnnotation, true)) { + return true; + } + } + + return false; + } } diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/Annotations/GroupDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/Annotations/GroupDummy.php index cf26b6e0da15d..1d502c60c5f86 100644 --- a/src/Symfony/Component/Serializer/Tests/Fixtures/Annotations/GroupDummy.php +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/Annotations/GroupDummy.php @@ -13,6 +13,7 @@ use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Tests\Fixtures\GroupDummyInterface; +use Symfony\Component\Serializer\Tests\Fixtures\ChildOfGroupsAnnotationDummy; /** * @author Kévin Dunglas @@ -27,6 +28,11 @@ class GroupDummy extends GroupDummyParent implements GroupDummyInterface * @Groups({"b", "c", "name_converter"}) */ protected $bar; + /** + * @ChildOfGroupsAnnotationDummy + */ + protected $quux; + private $fooBar; private $symfony; @@ -78,4 +84,14 @@ public function getSymfony() { return $this->symfony; } + + public function getQuux() + { + return $this->quux; + } + + public function setQuux($quux): void + { + $this->quux = $quux; + } } diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/GroupDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/GroupDummy.php index eef1c55be9e1e..a056442095834 100644 --- a/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/GroupDummy.php +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/Attributes/GroupDummy.php @@ -12,6 +12,7 @@ namespace Symfony\Component\Serializer\Tests\Fixtures\Attributes; use Symfony\Component\Serializer\Annotation\Groups; +use Symfony\Component\Serializer\Tests\Fixtures\ChildOfGroupsAnnotationDummy; use Symfony\Component\Serializer\Tests\Fixtures\GroupDummyInterface; /** @@ -23,6 +24,8 @@ class GroupDummy extends GroupDummyParent implements GroupDummyInterface private $foo; #[Groups(["b", "c", "name_converter"])] protected $bar; + #[ChildOfGroupsAnnotationDummy] + protected $quux; private $fooBar; private $symfony; @@ -68,4 +71,14 @@ public function getSymfony() { return $this->symfony; } + + public function getQuux() + { + return $this->quux; + } + + public function setQuux($quux): void + { + $this->quux = $quux; + } } diff --git a/src/Symfony/Component/Serializer/Tests/Fixtures/ChildOfGroupsAnnotationDummy.php b/src/Symfony/Component/Serializer/Tests/Fixtures/ChildOfGroupsAnnotationDummy.php new file mode 100644 index 0000000000000..653758dcad7ae --- /dev/null +++ b/src/Symfony/Component/Serializer/Tests/Fixtures/ChildOfGroupsAnnotationDummy.php @@ -0,0 +1,18 @@ +addGroup('name_converter'); $expected->addAttributeMetadata($bar); + $quux = new AttributeMetadata('quux'); + $quux->addGroup('d'); + $expected->addAttributeMetadata($quux); + $fooBar = new AttributeMetadata('fooBar'); $fooBar->addGroup('a'); $fooBar->addGroup('b'); diff --git a/src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php b/src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php index b2a76656d76fe..519d42ff284d9 100644 --- a/src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php +++ b/src/Symfony/Component/Serializer/Tests/Normalizer/PropertyNormalizerTest.php @@ -115,10 +115,11 @@ public function testNormalizeWithParentClass() $group->setBaz('baz'); $group->setFoo('foo'); $group->setBar('bar'); + $group->setQuux('quux'); $group->setKevin('Kevin'); $group->setCoopTilleuls('coop'); $this->assertEquals( - ['foo' => 'foo', 'bar' => 'bar', 'kevin' => 'Kevin', 'coopTilleuls' => 'coop', 'fooBar' => null, 'symfony' => null, 'baz' => 'baz'], + ['foo' => 'foo', 'bar' => 'bar', 'quux' => 'quux', 'kevin' => 'Kevin', 'coopTilleuls' => 'coop', 'fooBar' => null, 'symfony' => null, 'baz' => 'baz'], $this->normalizer->normalize($group, 'any') ); }