From 46ef0057874e725b6c77ca91bd84bce99159b2c0 Mon Sep 17 00:00:00 2001 From: Saleh Saeed Date: Mon, 1 Feb 2021 23:29:53 +0100 Subject: [PATCH] Add Yaml Documentation Fixes #1613 --- ...er.php => JsonDocumentationController.php} | 2 +- Controller/YamlDocumentationController.php | 48 +++++++++++++++++++ Resources/config/services.xml | 8 +++- Tests/Functional/SwaggerUiTest.php | 17 +++++++ Tests/Functional/TestKernel.php | 3 +- 5 files changed, 75 insertions(+), 3 deletions(-) rename Controller/{DocumentationController.php => JsonDocumentationController.php} (96%) create mode 100644 Controller/YamlDocumentationController.php diff --git a/Controller/DocumentationController.php b/Controller/JsonDocumentationController.php similarity index 96% rename from Controller/DocumentationController.php rename to Controller/JsonDocumentationController.php index 0450d3a..5d95f25 100644 --- a/Controller/DocumentationController.php +++ b/Controller/JsonDocumentationController.php @@ -18,7 +18,7 @@ use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; -final class DocumentationController +final class JsonDocumentationController { private $generatorLocator; diff --git a/Controller/YamlDocumentationController.php b/Controller/YamlDocumentationController.php new file mode 100644 index 0000000..62be3ad --- /dev/null +++ b/Controller/YamlDocumentationController.php @@ -0,0 +1,48 @@ +generatorLocator = $generatorLocator; + } + + public function __invoke(Request $request, $area = 'default') + { + if (!$this->generatorLocator->has($area)) { + 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 Response($spec->toYaml(), 200, [ + 'Content-Type' => 'text/x-yaml' + ]); + } +} diff --git a/Resources/config/services.xml b/Resources/config/services.xml index f2a34de..b7221b8 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -16,7 +16,13 @@ - + + + + + + + diff --git a/Tests/Functional/SwaggerUiTest.php b/Tests/Functional/SwaggerUiTest.php index 38b5d38..ddc9129 100644 --- a/Tests/Functional/SwaggerUiTest.php +++ b/Tests/Functional/SwaggerUiTest.php @@ -11,7 +11,9 @@ namespace Nelmio\ApiDocBundle\Tests\Functional; +use OpenApi\Annotations\Server; use Symfony\Bundle\FrameworkBundle\KernelBrowser; +use Symfony\Component\Yaml\Yaml; class SwaggerUiTest extends WebTestCase { @@ -72,4 +74,19 @@ class SwaggerUiTest extends WebTestCase $this->assertEquals($expected, json_decode($response->getContent(), true)); } + + public function testYamlDocs() + { + $this->client->request('GET', '/app_dev.php/docs.yaml'); + + $response = $this->client->getResponse(); + $this->assertEquals(200, $response->getStatusCode()); + $this->assertEquals('text/x-yaml; charset=UTF-8', $response->headers->get('Content-Type')); + + $spec = $this->getOpenApiDefinition(); + $spec->servers = [new Server(['url' => 'http://api.example.com/app_dev.php'])]; + $expected = $spec->toYaml(); + + $this->assertEquals($expected, $response->getContent()); + } } diff --git a/Tests/Functional/TestKernel.php b/Tests/Functional/TestKernel.php index 66885bf..2c9528f 100644 --- a/Tests/Functional/TestKernel.php +++ b/Tests/Functional/TestKernel.php @@ -87,7 +87,8 @@ class TestKernel extends Kernel $routes->import(__DIR__.'/Controller/InvokableController.php', '/', 'annotation'); $routes->import('', '/api', 'api_platform'); $routes->add('/docs/{area}', 'nelmio_api_doc.controller.swagger_ui')->setDefault('area', 'default'); - $routes->add('/docs.json', 'nelmio_api_doc.controller.swagger'); + $routes->add('/docs.json', 'nelmio_api_doc.controller.swagger_json'); + $routes->add('/docs.yaml', 'nelmio_api_doc.controller.swagger_yaml'); $routes->import(__DIR__.'/Controller/FOSRestController.php', '/', 'annotation'); if (class_exists(SerializedName::class)) {