diff --git a/Controller/YamlDocumentationController.php b/Controller/YamlDocumentationController.php new file mode 100644 index 0000000..7557fc8 --- /dev/null +++ b/Controller/YamlDocumentationController.php @@ -0,0 +1,47 @@ +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..8c888a6 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..01dc4a0 100644 --- a/Tests/Functional/SwaggerUiTest.php +++ b/Tests/Functional/SwaggerUiTest.php @@ -11,6 +11,7 @@ namespace Nelmio\ApiDocBundle\Tests\Functional; +use OpenApi\Annotations\Server; use Symfony\Bundle\FrameworkBundle\KernelBrowser; class SwaggerUiTest extends WebTestCase @@ -72,4 +73,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)) {