From 55c1d1162bfdfcadf4b6939a2dc22bd1aa092497 Mon Sep 17 00:00:00 2001 From: soyuka Date: Mon, 24 Oct 2022 17:54:07 +0200 Subject: [PATCH] fix(metadata): define a name on a single operation fixes #5082 --- ...butesResourceMetadataCollectionFactory.php | 4 ++-- .../Entity/AttributeOnlyOperation.php | 21 +++++++++++++++++++ ...sResourceMetadataCollectionFactoryTest.php | 17 +++++++++++++++ 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 tests/Fixtures/TestBundle/Entity/AttributeOnlyOperation.php diff --git a/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php index 55a58ccff75..f830d775af6 100644 --- a/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactory.php @@ -215,8 +215,8 @@ private function getOperationWithDefaults(ApiResource $resource, Operation $oper } // Check for name conflict - if ($operation->getName()) { - if (null !== $resource->getOperations() && !$resource->getOperations()->has($operation->getName())) { + if ($operation->getName() && null !== ($operations = $resource->getOperations())) { + if (!$operations->has($operation->getName())) { return [$operation->getName(), $operation]; } diff --git a/tests/Fixtures/TestBundle/Entity/AttributeOnlyOperation.php b/tests/Fixtures/TestBundle/Entity/AttributeOnlyOperation.php new file mode 100644 index 00000000000..e13550bb603 --- /dev/null +++ b/tests/Fixtures/TestBundle/Entity/AttributeOnlyOperation.php @@ -0,0 +1,21 @@ + + * + * 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\Get; + +#[Get(name: 'my own name')] +final class AttributeOnlyOperation +{ +} diff --git a/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php b/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php index 7c53b693c1f..85d4e228b9a 100644 --- a/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php +++ b/tests/Metadata/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php @@ -29,6 +29,7 @@ use ApiPlatform\Metadata\Resource\Factory\AttributesResourceMetadataCollectionFactory; use ApiPlatform\Metadata\Resource\ResourceMetadataCollection; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeDefaultOperations; +use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeOnlyOperation; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeResource; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\AttributeResources; use ApiPlatform\Tests\Fixtures\TestBundle\Entity\ExtraPropertiesResource; @@ -206,4 +207,20 @@ public function testExtraProperties(): void $this->assertEquals($extraPropertiesResource[0]->getExtraProperties(), ['foo' => 'bar']); $this->assertEquals($extraPropertiesResource->getOperation('_api_ExtraPropertiesResource_get')->getExtraProperties(), ['foo' => 'bar']); } + + public function testOverrideNameWithoutOperations(): void + { + $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(); + + $operation = new HttpOperation(shortName: 'AttributeOnlyOperation', class: AttributeOnlyOperation::class); + $this->assertEquals(new ResourceMetadataCollection(AttributeOnlyOperation::class, [ + new ApiResource( + shortName: 'AttributeOnlyOperation', + class: AttributeOnlyOperation::class, + operations: [ + 'my own name' => (new Get(name: 'my own name', priority: 1))->withOperation($operation), + ] + ), + ]), $attributeResourceMetadataCollectionFactory->create(AttributeOnlyOperation::class)); + } }