From 1f29be85f4cfd61427d407f4dc49ad673d1ec26a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zdene=CC=8Ck=20Drahos=CC=8C?= Date: Thu, 29 Jul 2021 12:01:54 +0200 Subject: [PATCH] Use json renderer in controller --- Controller/DocumentationController.php | 30 ++++++++++++-------------- Render/Json/JsonOpenApiRenderer.php | 6 ++++++ Resources/config/services.xml | 2 +- 3 files changed, 21 insertions(+), 17 deletions(-) diff --git a/Controller/DocumentationController.php b/Controller/DocumentationController.php index 0450d3a..4374bb2 100644 --- a/Controller/DocumentationController.php +++ b/Controller/DocumentationController.php @@ -11,35 +11,33 @@ namespace Nelmio\ApiDocBundle\Controller; -use OpenApi\Annotations\OpenApi; -use OpenApi\Annotations\Server; -use Psr\Container\ContainerInterface; +use Nelmio\ApiDocBundle\Render\RenderOpenApi; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; final class DocumentationController { - private $generatorLocator; + /** + * @var RenderOpenApi + */ + private $renderOpenApi; - public function __construct(ContainerInterface $generatorLocator) + public function __construct(RenderOpenApi $renderOpenApi) { - $this->generatorLocator = $generatorLocator; + $this->renderOpenApi = $renderOpenApi; } public function __invoke(Request $request, $area = 'default') { - if (!$this->generatorLocator->has($area)) { + try { + return JsonResponse::fromJsonString( + $this->renderOpenApi->render(RenderOpenApi::JSON, $area, [ + 'server_url' => '' !== $request->getBaseUrl() ? $request->getSchemeAndHttpHost().$request->getBaseUrl() : null, + ]) + ); + } catch (InvalidArgumentException $e) { throw new BadRequestHttpException(sprintf('Area "%s" is not supported as it isn\'t defined in config.', $area)); } - - /** @var OpenApi $spec */ - $spec = $this->generatorLocator->get($area)->generate(); - - if ('' !== $request->getBaseUrl()) { - $spec->servers = [new Server(['url' => $request->getSchemeAndHttpHost().$request->getBaseUrl()])]; - } - - return new JsonResponse($spec); } } diff --git a/Render/Json/JsonOpenApiRenderer.php b/Render/Json/JsonOpenApiRenderer.php index 09af9e1..a5da3c9 100644 --- a/Render/Json/JsonOpenApiRenderer.php +++ b/Render/Json/JsonOpenApiRenderer.php @@ -14,6 +14,7 @@ namespace Nelmio\ApiDocBundle\Render\Json; use Nelmio\ApiDocBundle\Render\OpenApiRenderer; use Nelmio\ApiDocBundle\Render\RenderOpenApi; use OpenApi\Annotations\OpenApi; +use OpenApi\Annotations\Server; class JsonOpenApiRenderer implements OpenApiRenderer { @@ -25,10 +26,15 @@ class JsonOpenApiRenderer implements OpenApiRenderer public function render(OpenApi $spec, array $options = []): string { $options += [ + 'server_url' => null, 'no-pretty' => false, ]; $flags = $options['no-pretty'] ? 0 : JSON_PRETTY_PRINT; + if ($options['server_url']) { + $spec->servers = [new Server(['url' => $options['server_url']])]; + } + return json_encode($spec, $flags); } } diff --git a/Resources/config/services.xml b/Resources/config/services.xml index d452034..3caaba4 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -18,7 +18,7 @@ - +