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 @@
-
+