From afe2725054df25dfbec5b730e95ab8c8c318cfa4 Mon Sep 17 00:00:00 2001 From: Maxcastel Date: Thu, 15 Oct 2026 10:26:01 +0200 Subject: [PATCH] fix(metadata): do not override the parameter provider with the filter provider --- ...meterResourceMetadataCollectionFactory.php | 2 +- ...rResourceMetadataCollectionFactoryTest.php | 41 +++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) diff --git a/src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php index 8fe0eb6f2d..317a0898fd 100644 --- a/src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/ParameterResourceMetadataCollectionFactory.php @@ -377,7 +377,7 @@ private function addFilterMetadata(Parameter $parameter): Parameter return $parameter; } - if ($filter instanceof ParameterProviderFilterInterface) { + if (null === $parameter->getProvider() && $filter instanceof ParameterProviderFilterInterface) { $parameter = $parameter->withProvider($filter::getParameterProvider()); } diff --git a/src/Metadata/Tests/Resource/Factory/ParameterResourceMetadataCollectionFactoryTest.php b/src/Metadata/Tests/Resource/Factory/ParameterResourceMetadataCollectionFactoryTest.php index 8b9540f326..561a433de5 100644 --- a/src/Metadata/Tests/Resource/Factory/ParameterResourceMetadataCollectionFactoryTest.php +++ b/src/Metadata/Tests/Resource/Factory/ParameterResourceMetadataCollectionFactoryTest.php @@ -1264,6 +1264,26 @@ public function testSimplePropertyHasNoNestedPropertyInfo(): void $this->assertArrayNotHasKey('nested_properties_info', $param->getExtraProperties()); } + public function testExplicitProviderIsNotOverriddenByFilterProvider(): void + { + $nameCollection = $this->createStub(PropertyNameCollectionFactoryInterface::class); + $nameCollection->method('create')->willReturn(new PropertyNameCollection(['id'])); + + $propertyMetadata = $this->createStub(PropertyMetadataFactoryInterface::class); + $propertyMetadata->method('create')->willReturn(new ApiProperty(readable: true)); + + $parameterFactory = new ParameterResourceMetadataCollectionFactory( + $nameCollection, + $propertyMetadata, + new AttributesResourceMetadataCollectionFactory() + ); + + $parameters = $parameterFactory->create(HasExplicitParameterProvider::class)->getOperation(forceCollection: true)->getParameters(); + + $this->assertSame('custom_provider', $parameters->get('explicit')->getProvider()); + $this->assertSame('filter_provider', $parameters->get('default')->getProvider()); + } + public function testProviderAttachedForClassStringFilterNotRegisteredAsFilterInterface(): void { $nameCollection = $this->createStub(PropertyNameCollectionFactoryInterface::class); @@ -1303,6 +1323,27 @@ public static function getParameterProvider(): string } } +class ParameterProviderFilter implements FilterInterface, ParameterProviderFilterInterface +{ + public function getDescription(string $resourceClass): array + { + return []; + } + + public static function getParameterProvider(): string + { + return 'filter_provider'; + } +} + +#[ApiResource] +#[QueryParameter(key: 'explicit', filter: new ParameterProviderFilter(), provider: 'custom_provider')] +#[QueryParameter(key: 'default', filter: new ParameterProviderFilter())] +class HasExplicitParameterProvider +{ + public $id; +} + #[ApiResource] #[QueryParameter(key: 'sparse', filter: ClassStringParameterProviderFilter::class)] class HasClassStringParameterProviderFilter