From 9f23898e2f44687dc5d0a068fff314d89e9263b1 Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Fri, 16 Oct 2026 11:40:42 +0200 Subject: [PATCH 1/2] fix(metadata): do not duplicate list defaults on operations --- .../Resource/Factory/OperationDefaultsTrait.php | 8 +++++++- ...utesResourceMetadataCollectionFactoryTest.php | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Metadata/Resource/Factory/OperationDefaultsTrait.php b/src/Metadata/Resource/Factory/OperationDefaultsTrait.php index 3c53fc69840..bcd0fadfcba 100644 --- a/src/Metadata/Resource/Factory/OperationDefaultsTrait.php +++ b/src/Metadata/Resource/Factory/OperationDefaultsTrait.php @@ -77,7 +77,13 @@ private function addGlobalDefaults(ApiResource|Operation $operation): ApiResourc $value = [$value]; } - $operation = $operation->{'with'.$upperKey}(array_merge($value, $currentValue)); + $value = array_merge($value, $currentValue); + + if (array_is_list($value)) { + $value = array_values(array_unique($value, \SORT_REGULAR)); + } + + $operation = $operation->{'with'.$upperKey}($value); } if (null !== $currentValue || null === $value) { diff --git a/src/Metadata/Tests/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php b/src/Metadata/Tests/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php index f9eef140bc9..8b211f10fee 100644 --- a/src/Metadata/Tests/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php +++ b/src/Metadata/Tests/Resource/Factory/AttributesResourceMetadataCollectionFactoryTest.php @@ -246,6 +246,22 @@ public function testExtraProperties(): void $this->assertEquals($extraPropertiesResource->getOperation('_api_ExtraPropertiesResource_get')->getExtraProperties(), ['foo' => 'bar']); } + public function testCreateWithListDefaults(): void + { + $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(defaults: [ + 'types' => ['https://schema.org/CreativeWork'], + 'schemes' => ['https'], + ]); + + $resourceMetadataCollection = $attributeResourceMetadataCollectionFactory->create(AttributeResource::class); + $operation = $resourceMetadataCollection->getOperation('_api_AttributeResource_get'); + + $this->assertSame(['https://schema.org/CreativeWork'], $resourceMetadataCollection[0]->getTypes()); + $this->assertInstanceOf(HttpOperation::class, $operation); + $this->assertSame(['https://schema.org/CreativeWork'], $operation->getTypes()); + $this->assertSame(['https'], $operation->getSchemes()); + } + public function testOverrideNameWithoutOperations(): void { $attributeResourceMetadataCollectionFactory = new AttributesResourceMetadataCollectionFactory(); From 0676dde6ecb513ffbe2e0196fe15efbc7b96a74f Mon Sep 17 00:00:00 2001 From: soyuka Date: Tue, 3 Nov 2026 16:42:54 +0100 Subject: [PATCH 2/2] refactor(metadata): dedupe list defaults strictly --- .../Resource/Factory/OperationDefaultsTrait.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Metadata/Resource/Factory/OperationDefaultsTrait.php b/src/Metadata/Resource/Factory/OperationDefaultsTrait.php index bcd0fadfcba..fbc90a1f509 100644 --- a/src/Metadata/Resource/Factory/OperationDefaultsTrait.php +++ b/src/Metadata/Resource/Factory/OperationDefaultsTrait.php @@ -77,13 +77,13 @@ private function addGlobalDefaults(ApiResource|Operation $operation): ApiResourc $value = [$value]; } - $value = array_merge($value, $currentValue); - - if (array_is_list($value)) { - $value = array_values(array_unique($value, \SORT_REGULAR)); + foreach ($value as $index => $item) { + if (\is_int($index) && \in_array($item, $currentValue, true)) { + unset($value[$index]); + } } - $operation = $operation->{'with'.$upperKey}($value); + $operation = $operation->{'with'.$upperKey}(array_merge($value, $currentValue)); } if (null !== $currentValue || null === $value) {