From 41ef3bd3b059eb01f36c203674d42627dc5e2f4f Mon Sep 17 00:00:00 2001 From: soyuka Date: Mon, 23 May 2022 17:02:48 +0200 Subject: [PATCH] fix(metadata): extra properties operation inheritance --- ...butesResourceMetadataCollectionFactory.php | 2 ++ .../Entity/ExtraPropertiesResource.php | 25 +++++++++++++++++++ ...sResourceMetadataCollectionFactoryTest.php | 10 ++++++++ 3 files changed, 37 insertions(+) create mode 100644 tests/Fixtures/TestBundle/Entity/ExtraPropertiesResource.php diff --git a/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php index 9e46f5631b0..1f2bd8433a5 100644 --- a/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php @@ -194,6 +194,8 @@ private function getOperationWithDefaults(ApiResource $resource, Operation $oper $operation = $operation->{'with'.substr($methodName, 3)}($value); } + $operation = $operation->withExtraProperties(array_merge($resource->getExtraProperties(), $operation->getExtraProperties())); + // Add global defaults attributes to the operation $operation = $this->addGlobalDefaults($operation); diff --git a/tests/Fixtures/TestBundle/Entity/ExtraPropertiesResource.php b/tests/Fixtures/TestBundle/Entity/ExtraPropertiesResource.php new file mode 100644 index 00000000000..5d6158d9c75 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/ExtraPropertiesResource.php @@ -0,0 +1,25 @@ + + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +declare(strict_types=1); + +namespace ApiPlatform\Tests\Fixtures\TestBundle\Entity; + +use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\Get; + +#[ApiResource( + extraProperties: ['foo' => 'bar'] +)] +#[Get] +final class ExtraPropertiesResource +{ +} diff --git a/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php b/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php index 8f60b10803a..ac8bba952b6 100644 --- a/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php +++ b/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php @@ -31,6 +31,7 @@ use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeDefaultOperations; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeResource; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeResources; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ExtraPropertiesResource; use ApiPlatform\Tests\Fixtures\TestBundle\State\AttributeResourceProcessor; use ApiPlatform\Tests\Fixtures\TestBundle\State\AttributeResourceProvider; use PHPUnit\Framework\TestCase; @@ -187,4 +188,13 @@ class: AttributeDefaultOperations::class, ), ]), $attributeResourceMetadataCollectionFactory->create(AttributeDefaultOperations::class)); } + + public function testExtraProperties(): void + { + $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(); + $extraPropertiesResource = $attributeResourceMetadataCollectionFactory->create(ExtraPropertiesResource::class); + + $this->assertEquals($extraPropertiesResource[0]->getExtraProperties(), ['foo' => 'bar']); + $this->assertEquals($extraPropertiesResource->getOperation('_api_ExtraPropertiesResource_get')->getExtraProperties(), ['foo' => 'bar']); + } }