diff --git a/src/Hydra/Serializer/DocumentationNormalizer.php b/src/Hydra/Serializer/DocumentationNormalizer.php index b565fc4e0c6..a54395cce8e 100644 --- a/src/Hydra/Serializer/DocumentationNormalizer.php +++ b/src/Hydra/Serializer/DocumentationNormalizer.php @@ -257,6 +257,10 @@ private function getHydraOperations(bool $collection, ?ResourceMetadataCollectio $hydraOperations = []; foreach ($resourceMetadataCollection as $resourceMetadata) { foreach ($resourceMetadata->getOperations() as $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if (true === $operation->getHideHydraOperation()) { continue; } diff --git a/src/JsonSchema/ResourceMetadataTrait.php b/src/JsonSchema/ResourceMetadataTrait.php index 71988820c76..b949e779625 100644 --- a/src/JsonSchema/ResourceMetadataTrait.php +++ b/src/JsonSchema/ResourceMetadataTrait.php @@ -77,6 +77,10 @@ private function findOperationForType(ResourceMetadataCollection $resourceMetada // Find the operation and use the first one that matches criterias foreach ($resourceMetadataCollection as $resourceMetadata) { foreach ($resourceMetadata->getOperations() ?? [] as $op) { + if (!$op instanceof HttpOperation) { + continue; + } + if (!$lookForCollection && $op instanceof CollectionOperationInterface) { continue; } diff --git a/src/Metadata/Operation/Factory/OperationMetadataFactory.php b/src/Metadata/Operation/Factory/OperationMetadataFactory.php index 8f966d80203..10686bc69f4 100644 --- a/src/Metadata/Operation/Factory/OperationMetadataFactory.php +++ b/src/Metadata/Operation/Factory/OperationMetadataFactory.php @@ -13,6 +13,7 @@ namespace ApiPlatform\Metadata\Operation\Factory; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Operation; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface; @@ -28,6 +29,10 @@ public function create(string $uriTemplate, array $context = []): ?Operation foreach ($this->resourceNameCollectionFactory->create() as $resourceClass) { foreach ($this->resourceMetadataCollectionFactory->create($resourceClass) as $resource) { foreach ($resource->getOperations() as $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getUriTemplate() === $uriTemplate || $operation->getName() === $uriTemplate) { return $operation; } diff --git a/src/Metadata/Resource/Factory/MainControllerResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/MainControllerResourceMetadataCollectionFactory.php index 7987032f836..be1b1a45211 100644 --- a/src/Metadata/Resource/Factory/MainControllerResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/MainControllerResourceMetadataCollectionFactory.php @@ -14,6 +14,7 @@ namespace ApiPlatform\Metadata\Resource\Factory; use ApiPlatform\Metadata\ApiResource; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Operations; use ApiPlatform\Metadata\Resource\ResourceMetadataCollection; @@ -42,6 +43,10 @@ public function create(string $resourceClass): ResourceMetadataCollection /** @var ApiResource $resource */ $operations = $resource->getOperations() ?? new Operations(); foreach ($resource->getOperations() as $key => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getRouteName() || $operation->getController()) { continue; } diff --git a/src/Metadata/Resource/Factory/MetadataCollectionFactoryTrait.php b/src/Metadata/Resource/Factory/MetadataCollectionFactoryTrait.php index 7561858e799..6033a4aeda0 100644 --- a/src/Metadata/Resource/Factory/MetadataCollectionFactoryTrait.php +++ b/src/Metadata/Resource/Factory/MetadataCollectionFactoryTrait.php @@ -189,6 +189,10 @@ private function buildResourceOperations(array $metadataCollection, string $reso private function hasSameOperation(ApiResource $resource, string $operationClass, HttpOperation $operation): bool { foreach ($resource->getOperations() ?? [] as $o) { + if (!$o instanceof HttpOperation) { + continue; + } + if ($o instanceof $operationClass && $operation->getUriTemplate() === $o->getUriTemplate() && $operation->getName() === $o->getName() && $operation->getRouteName() === $o->getRouteName()) { return true; } diff --git a/src/Metadata/Resource/Factory/OperationNameResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/OperationNameResourceMetadataCollectionFactory.php index f79c092c254..63be60f395f 100644 --- a/src/Metadata/Resource/Factory/OperationNameResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/OperationNameResourceMetadataCollectionFactory.php @@ -13,6 +13,7 @@ namespace ApiPlatform\Metadata\Resource\Factory; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Resource\ResourceMetadataCollection; /** @@ -47,6 +48,10 @@ public function create(string $resourceClass): ResourceMetadataCollection continue; } + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getRouteName()) { $operations->add($operationName, $operation->withName($operation->getRouteName())); continue; diff --git a/src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php b/src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php index feace7c512c..236bd7e68eb 100644 --- a/src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php +++ b/src/Metadata/Resource/Factory/UriTemplateResourceMetadataCollectionFactory.php @@ -52,6 +52,10 @@ public function create(string $resourceClass): ResourceMetadataCollection $operations = new Operations(); foreach ($resource->getOperations() ?? new Operations() as $key => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + /** @var HttpOperation */ $operation = $this->configureUriVariables($operation); diff --git a/src/Metadata/Resource/ResourceMetadataCollection.php b/src/Metadata/Resource/ResourceMetadataCollection.php index f55f83dc1c7..10fe8961c2c 100644 --- a/src/Metadata/Resource/ResourceMetadataCollection.php +++ b/src/Metadata/Resource/ResourceMetadataCollection.php @@ -16,6 +16,7 @@ use ApiPlatform\Metadata\ApiResource; use ApiPlatform\Metadata\CollectionOperationInterface; use ApiPlatform\Metadata\Exception\OperationNotFoundException; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Operation; /** @@ -58,6 +59,10 @@ public function getOperation(?string $operationName = null, bool $forceCollectio if (!$forceGraphQl) { foreach ($metadata->getOperations() ?? [] as $name => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + $isCollection = $operation instanceof CollectionOperationInterface; $method = $operation->getMethod(); $isGetOperation = 'GET' === $method || 'OPTIONS' === $method || 'HEAD' === $method; diff --git a/src/OpenApi/Factory/OpenApiFactory.php b/src/OpenApi/Factory/OpenApiFactory.php index 3759fa4266d..92d8233e613 100644 --- a/src/OpenApi/Factory/OpenApiFactory.php +++ b/src/OpenApi/Factory/OpenApiFactory.php @@ -177,6 +177,10 @@ private function collectPaths(ApiResource $resource, ResourceMetadataCollection } foreach ($resource->getOperations() as $operationName => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + $resourceShortName = $operation->getShortName() ?? $operation; // No path to return if (null === $operation->getUriTemplate() && null === $operation->getRouteName()) { diff --git a/src/State/ErrorProvider.php b/src/State/ErrorProvider.php index a6ebb62426f..b2a9e3fe5a0 100644 --- a/src/State/ErrorProvider.php +++ b/src/State/ErrorProvider.php @@ -48,6 +48,10 @@ public function provide(Operation $operation, array $uriVariables = [], array $c $resourceCollection = $this->resourceMetadataCollectionFactory->create($operation->getClass()); foreach ($resourceCollection as $resource) { foreach ($resource->getOperations() as $name => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if (isset($operation->getOutputFormats()[$request->getRequestFormat()])) { $request->attributes->set('_api_operation', $operation); $request->attributes->set('_api_operation_nme', $name); diff --git a/src/Symfony/Bundle/Command/DebugResourceCommand.php b/src/Symfony/Bundle/Command/DebugResourceCommand.php index f4a8ed8ffc4..f37dadf5974 100644 --- a/src/Symfony/Bundle/Command/DebugResourceCommand.php +++ b/src/Symfony/Bundle/Command/DebugResourceCommand.php @@ -13,6 +13,7 @@ namespace ApiPlatform\Symfony\Bundle\Command; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; use Symfony\Component\Console\Attribute\AsCommand; use Symfony\Component\Console\Command\Command; @@ -73,6 +74,10 @@ protected function execute(InputInterface $input, OutputInterface $output): int } foreach ($resource->getOperations() as $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getUriTemplate()) { $resources[] = ($resource->getRoutePrefix() ?? '').$operation->getUriTemplate(); break; diff --git a/src/Symfony/EventListener/ErrorListener.php b/src/Symfony/EventListener/ErrorListener.php index c0eab7879dc..38738988066 100644 --- a/src/Symfony/EventListener/ErrorListener.php +++ b/src/Symfony/EventListener/ErrorListener.php @@ -228,6 +228,10 @@ class: Error::class, // TODO: move this to ResourceMetadataCollection? foreach ($resourceCollection as $resource) { foreach ($resource->getOperations() as $op) { + if (!$op instanceof HttpOperation) { + continue; + } + foreach ($op->getOutputFormats() ?? [] as $key => $value) { if ($key === $format) { $operation = $op; diff --git a/src/Symfony/Routing/ApiLoader.php b/src/Symfony/Routing/ApiLoader.php index f3abea05d35..c340cfd583f 100644 --- a/src/Symfony/Routing/ApiLoader.php +++ b/src/Symfony/Routing/ApiLoader.php @@ -14,6 +14,7 @@ namespace ApiPlatform\Symfony\Routing; use ApiPlatform\Metadata\Exception\RuntimeException; +use ApiPlatform\Metadata\HttpOperation; use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface; use ApiPlatform\Metadata\Resource\Factory\ResourceNameCollectionFactoryInterface; use ApiPlatform\OpenApi\Attributes\Webhook; @@ -57,6 +58,10 @@ public function load(mixed $data, ?string $type = null): RouteCollection foreach ($this->resourceNameCollectionFactory->create() as $resourceClass) { foreach ($this->resourceMetadataFactory->create($resourceClass) as $resourceMetadata) { foreach ($resourceMetadata->getOperations() as $operationName => $operation) { + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getOpenapi() instanceof Webhook) { continue; } diff --git a/src/Validator/Metadata/Resource/Factory/ParameterValidationResourceMetadataCollectionFactory.php b/src/Validator/Metadata/Resource/Factory/ParameterValidationResourceMetadataCollectionFactory.php index 27bc2b2dc1e..b598f42e977 100644 --- a/src/Validator/Metadata/Resource/Factory/ParameterValidationResourceMetadataCollectionFactory.php +++ b/src/Validator/Metadata/Resource/Factory/ParameterValidationResourceMetadataCollectionFactory.php @@ -47,6 +47,10 @@ public function create(string $resourceClass): ResourceMetadataCollection } // As we deprecate the parameter validator, we declare a parameter for each filter transfering validation to the new system + if (!$operation instanceof HttpOperation) { + continue; + } + if ($operation->getFilters() && 0 === $parameters->count()) { $parameters = $this->addFilterValidation($operation); }