From a119a3724180992e39a494be07911cc5d3cbf3e8 Mon Sep 17 00:00:00 2001 From: camohob Date: Thu, 25 Mar 2021 18:05:24 +0300 Subject: [PATCH] Add `swagger_ui_extra_configuration` to Swagger configuration (#3731) (cherry picked from commit 930c930debe0f14fd7c6a0a46034d9e858f17846) --- .../Symfony/Bundle/Action/SwaggerUiAction.php | 26 +++++++++++++++--- .../ApiPlatformExtension.php | 16 +++++++++++ .../DependencyInjection/Configuration.php | 2 -- .../Bundle/Resources/config/swagger-ui.xml | 27 +++++++++++++++++++ .../ApiPlatformExtensionTest.php | 2 ++ .../DependencyInjection/ConfigurationTest.php | 16 +++++++++++ 6 files changed, 84 insertions(+), 5 deletions(-) diff --git a/src/Bridge/Symfony/Bundle/Action/SwaggerUiAction.php b/src/Bridge/Symfony/Bundle/Action/SwaggerUiAction.php index 83bebc0e64e..5a03d2baffd 100644 --- a/src/Bridge/Symfony/Bundle/Action/SwaggerUiAction.php +++ b/src/Bridge/Symfony/Bundle/Action/SwaggerUiAction.php @@ -14,6 +14,7 @@ namespace ApiPlatform\Core\Bridge\Symfony\Bundle\Action; use ApiPlatform\Core\Api\FormatsProviderInterface; +use ApiPlatform\Core\Bridge\Symfony\Bundle\SwaggerUi\SwaggerUiAction as OpenApiSwaggerUiAction; use ApiPlatform\Core\Documentation\Documentation; use ApiPlatform\Core\Exception\RuntimeException; use ApiPlatform\Core\Metadata\Resource\Factory\ResourceMetadataFactoryInterface; @@ -28,6 +29,8 @@ /** * Displays the documentation. * + * @deprecated please refer to ApiPlatform\Core\Bridge\Symfony\Bundle\SwaggerUi\SwaggerUiAction for further changes + * * @author Kévin Dunglas */ final class SwaggerUiAction @@ -57,11 +60,15 @@ final class SwaggerUiAction private $graphiQlEnabled; private $graphQlPlaygroundEnabled; private $swaggerVersions; + private $swaggerUiAction; + private $assetPackage; + private $swaggerUiExtraConfiguration; /** - * @param int[] $swaggerVersions + * @param int[] $swaggerVersions + * @param mixed|null $assetPackage */ - public function __construct(ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, NormalizerInterface $normalizer, TwigEnvironment $twig, UrlGeneratorInterface $urlGenerator, string $title = '', string $description = '', string $version = '', $formats = [], $oauthEnabled = false, $oauthClientId = '', $oauthClientSecret = '', $oauthType = '', $oauthFlow = '', $oauthTokenUrl = '', $oauthAuthorizationUrl = '', $oauthScopes = [], bool $showWebby = true, bool $swaggerUiEnabled = false, bool $reDocEnabled = false, bool $graphqlEnabled = false, bool $graphiQlEnabled = false, bool $graphQlPlaygroundEnabled = false, array $swaggerVersions = [2, 3]) + public function __construct(ResourceNameCollectionFactoryInterface $resourceNameCollectionFactory, ResourceMetadataFactoryInterface $resourceMetadataFactory, NormalizerInterface $normalizer, TwigEnvironment $twig, UrlGeneratorInterface $urlGenerator, string $title = '', string $description = '', string $version = '', $formats = [], $oauthEnabled = false, $oauthClientId = '', $oauthClientSecret = '', $oauthType = '', $oauthFlow = '', $oauthTokenUrl = '', $oauthAuthorizationUrl = '', $oauthScopes = [], bool $showWebby = true, bool $swaggerUiEnabled = false, bool $reDocEnabled = false, bool $graphqlEnabled = false, bool $graphiQlEnabled = false, bool $graphQlPlaygroundEnabled = false, array $swaggerVersions = [2, 3], OpenApiSwaggerUiAction $swaggerUiAction = null, $assetPackage = null, array $swaggerUiExtraConfiguration = []) { $this->resourceNameCollectionFactory = $resourceNameCollectionFactory; $this->resourceMetadataFactory = $resourceMetadataFactory; @@ -86,6 +93,13 @@ public function __construct(ResourceNameCollectionFactoryInterface $resourceName $this->graphiQlEnabled = $graphiQlEnabled; $this->graphQlPlaygroundEnabled = $graphQlPlaygroundEnabled; $this->swaggerVersions = $swaggerVersions; + $this->swaggerUiAction = $swaggerUiAction; + $this->swaggerUiExtraConfiguration = $swaggerUiExtraConfiguration; + $this->assetPackage = $assetPackage; + + if (null === $this->swaggerUiAction) { + @trigger_error(sprintf('The use of "%s" is deprecated since API Platform 2.6, use "%s" instead.', __CLASS__, OpenApiSwaggerUiAction::class), \E_USER_DEPRECATED); + } if (\is_array($formats)) { $this->formats = $formats; @@ -93,12 +107,16 @@ public function __construct(ResourceNameCollectionFactoryInterface $resourceName return; } - @trigger_error(sprintf('Passing an array or an instance of "%s" as 5th parameter of the constructor of "%s" is deprecated since API Platform 2.5, pass an array instead', FormatsProviderInterface::class, __CLASS__), E_USER_DEPRECATED); + @trigger_error(sprintf('Passing an array or an instance of "%s" as 5th parameter of the constructor of "%s" is deprecated since API Platform 2.5, pass an array instead', FormatsProviderInterface::class, __CLASS__), \E_USER_DEPRECATED); $this->formatsProvider = $formats; } public function __invoke(Request $request) { + if ($this->swaggerUiAction) { + return $this->swaggerUiAction->__invoke($request); + } + $attributes = RequestAttributesExtractor::extractAttributes($request); // BC check to be removed in 3.0 @@ -130,6 +148,7 @@ private function getContext(Request $request, Documentation $documentation): arr 'graphqlEnabled' => $this->graphqlEnabled, 'graphiQlEnabled' => $this->graphiQlEnabled, 'graphQlPlaygroundEnabled' => $this->graphQlPlaygroundEnabled, + 'assetPackage' => $this->assetPackage, ]; $swaggerContext = ['spec_version' => $request->query->getInt('spec_version', $this->swaggerVersions[0] ?? 2)]; @@ -140,6 +159,7 @@ private function getContext(Request $request, Documentation $documentation): arr $swaggerData = [ 'url' => $this->urlGenerator->generate('api_doc', ['format' => 'json']), 'spec' => $this->normalizer->normalize($documentation, 'json', $swaggerContext), + 'extraConfiguration' => $this->swaggerUiExtraConfiguration, ]; $swaggerData['oauth'] = [ diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php index 2cb000e055f..982ffeedbbe 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtension.php @@ -100,6 +100,7 @@ public function load(array $configs, ContainerBuilder $container): void $this->registerCommonConfiguration($container, $config, $loader, $formats, $patchFormats, $errorFormats); $this->registerMetadataConfiguration($container, $config, $loader); $this->registerOAuthConfiguration($container, $config); + $this->registerOpenApiConfiguration($container, $config); $this->registerSwaggerConfiguration($container, $config, $loader); $this->registerJsonApiConfiguration($formats, $loader); $this->registerJsonLdHydraConfiguration($container, $formats, $loader, $config['enable_docs']); @@ -344,6 +345,11 @@ private function registerSwaggerConfiguration(ContainerBuilder $container, array $container->setParameter('api_platform.enable_swagger_ui', $config['enable_swagger_ui']); $container->setParameter('api_platform.enable_re_doc', $config['enable_re_doc']); $container->setParameter('api_platform.swagger.api_keys', $config['swagger']['api_keys']); + $container->setParameter('api_platform.swagger_ui.extra_configuration', $config['openapi']['swagger_ui_extra_configuration'] ?? $config['swagger']['swagger_ui_extra_configuration']); + + if (true === $config['openapi']['backward_compatibility_layer']) { + $container->getDefinition('api_platform.swagger.normalizer.documentation')->addArgument($container->getDefinition('api_platform.openapi.normalizer')); + } } private function registerJsonApiConfiguration(array $formats, XmlFileLoader $loader): void @@ -629,6 +635,16 @@ private function registerSecurityConfiguration(ContainerBuilder $container, XmlF } } + private function registerOpenApiConfiguration(ContainerBuilder $container, array $config): void + { + $container->setParameter('api_platform.openapi.termsOfService', $config['openapi']['termsOfService']); + $container->setParameter('api_platform.openapi.contact.name', $config['openapi']['contact']['name']); + $container->setParameter('api_platform.openapi.contact.url', $config['openapi']['contact']['url']); + $container->setParameter('api_platform.openapi.contact.email', $config['openapi']['contact']['email']); + $container->setParameter('api_platform.openapi.license.name', $config['openapi']['license']['name']); + $container->setParameter('api_platform.openapi.license.url', $config['openapi']['license']['url']); + } + private function buildDeprecationArgs(string $version, string $message): array { return method_exists(Definition::class, 'getDeprecation') diff --git a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php index b3ec0a01422..cbc5906ccd7 100644 --- a/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php +++ b/src/Bridge/Symfony/Bundle/DependencyInjection/Configuration.php @@ -187,8 +187,6 @@ public function getConfigTreeBuilder() 'jsonld' => ['mime_types' => ['application/ld+json']], ]); - $this->addDefaultsSection($rootNode); - return $treeBuilder; } diff --git a/src/Bridge/Symfony/Bundle/Resources/config/swagger-ui.xml b/src/Bridge/Symfony/Bundle/Resources/config/swagger-ui.xml index 2bcb783853c..43f2b33d20c 100644 --- a/src/Bridge/Symfony/Bundle/Resources/config/swagger-ui.xml +++ b/src/Bridge/Symfony/Bundle/Resources/config/swagger-ui.xml @@ -35,6 +35,33 @@ %api_platform.graphql.graphiql.enabled% %api_platform.graphql.graphql_playground.enabled% %api_platform.swagger.versions% + + %api_platform.asset_package% + %api_platform.swagger_ui.extra_configuration% + + + + %api_platform.enable_swagger_ui% + %api_platform.show_webby% + %api_platform.enable_re_doc% + %api_platform.graphql.enabled% + %api_platform.graphql.graphiql.enabled% + %api_platform.graphql.graphql_playground.enabled% + %api_platform.asset_package% + %api_platform.swagger_ui.extra_configuration% + + + + + + + + + + + %api_platform.formats% + %api_platform.oauth.clientId% + %api_platform.oauth.clientSecret% diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php index 1376d38586d..e30e4cc5b35 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ApiPlatformExtensionTest.php @@ -232,6 +232,7 @@ public function testSetNameConverter() $containerBuilderProphecy->hasParameter('kernel.debug')->willReturn(true); $containerBuilderProphecy->getParameter('kernel.debug')->willReturn(false); $containerBuilderProphecy->setAlias('api_platform.name_converter', $nameConverterId)->shouldBeCalled(); + $containerBuilderProphecy->setParameter('api_platform.swagger_ui.extra_configuration', [])->shouldBeCalled(); $containerBuilder = $containerBuilderProphecy->reveal(); @@ -1090,6 +1091,7 @@ private function getBaseContainerBuilderProphecy(array $doctrineIntegrationsToLo if ($hasSwagger) { $parameters['api_platform.swagger.versions'] = [2, 3]; $parameters['api_platform.swagger.api_keys'] = []; + $parameters['api_platform.swagger_ui.extra_configuration'] = []; } else { $parameters['api_platform.swagger.versions'] = []; } diff --git a/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php b/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php index e8c07bfb8b1..730dc5948f5 100644 --- a/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php +++ b/tests/Bridge/Symfony/Bundle/DependencyInjection/ConfigurationTest.php @@ -149,6 +149,7 @@ private function runDefaultConfigTests(array $doctrineIntegrationsToLoad = ['orm 'swagger' => [ 'versions' => [2, 3], 'api_keys' => [], + 'swagger_ui_extra_configuration' => [], ], 'eager_loading' => [ 'enabled' => true, @@ -204,6 +205,21 @@ private function runDefaultConfigTests(array $doctrineIntegrationsToLoad = ['orm ], 'allow_plain_identifiers' => false, 'resource_class_directories' => [], + 'asset_package' => null, + 'openapi' => [ + 'contact' => [ + 'name' => null, + 'url' => null, + 'email' => null, + ], + 'termsOfService' => null, + 'license' => [ + 'name' => null, + 'url' => null, + ], + 'backward_compatibility_layer' => true, + 'swagger_ui_extra_configuration' => [], + ], ], $config); }