diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index d17877ad2..6d1690f54 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -95,6 +95,7 @@ public function load(array $configs, ContainerBuilder $container) new Reference(sprintf('nelmio_api_doc.routes.%s', $area)), new Reference('nelmio_api_doc.controller_reflector'), new Reference('annotation_reader'), + new Reference('logger'), ]) ->addTag(sprintf('nelmio_api_doc.describer.%s', $area), ['priority' => -200]); } diff --git a/Describer/SwaggerPhpDescriber.php b/Describer/SwaggerPhpDescriber.php index f6eef4afb..f3f52818d 100644 --- a/Describer/SwaggerPhpDescriber.php +++ b/Describer/SwaggerPhpDescriber.php @@ -18,6 +18,7 @@ use Nelmio\ApiDocBundle\SwaggerPhp\AddDefaults; use Nelmio\ApiDocBundle\SwaggerPhp\ModelRegister; use Nelmio\ApiDocBundle\Util\ControllerReflector; +use Psr\Log\LoggerInterface; use Swagger\Analysis; use Swagger\Annotations\AbstractAnnotation; use Swagger\Annotations as SWG; @@ -31,13 +32,15 @@ final class SwaggerPhpDescriber implements ModelRegistryAwareInterface private $routeCollection; private $controllerReflector; private $annotationReader; + private $logger; private $overwrite; - public function __construct(RouteCollection $routeCollection, ControllerReflector $controllerReflector, Reader $annotationReader, bool $overwrite = false) + public function __construct(RouteCollection $routeCollection, ControllerReflector $controllerReflector, Reader $annotationReader, LoggerInterface $logger, bool $overwrite = false) { $this->routeCollection = $routeCollection; $this->controllerReflector = $controllerReflector; $this->annotationReader = $annotationReader; + $this->logger = $logger; $this->overwrite = $overwrite; } @@ -215,8 +218,18 @@ private function getMethodsToParse(): \Generator $path = $this->normalizePath($route->getPath()); $httpMethods = $route->getMethods() ?: Swagger::$METHODS; $httpMethods = array_map('strtolower', $httpMethods); + $supportedHttpMethods = array_intersect($httpMethods, Swagger::$METHODS); - yield $method => [$path, $httpMethods]; + if (empty($supportedHttpMethods)) { + $this->logger->warning('None of the HTTP methods specified for path {path} are supported by swagger-ui, skipping this path', [ + 'path' => $path, + 'methods' => $httpMethods, + ]); + + continue; + } + + yield $method => [$path, $supportedHttpMethods]; } } } diff --git a/Tests/Functional/Controller/ApiController.php b/Tests/Functional/Controller/ApiController.php index 2db5fa5d5..678fee8b7 100644 --- a/Tests/Functional/Controller/ApiController.php +++ b/Tests/Functional/Controller/ApiController.php @@ -44,7 +44,9 @@ public function fetchArticleAction() } /** - * @Route("/swagger", methods={"GET"}) + * The method LINK is not supported by OpenAPI so the method will be ignored. + * + * @Route("/swagger", methods={"GET", "LINK"}) * @Route("/swagger2", methods={"GET"}) * @Operation( * @SWG\Response(response="201", description="An example resource")