From 9c729ab7b70bb608af6ea9b313adbc311c21596d Mon Sep 17 00:00:00 2001 From: Guilhem Niot Date: Wed, 22 Sep 2021 23:43:32 +0200 Subject: [PATCH] Fix support without twig (#1878) * fix support without twig * Support null openApiRenderer * Register a twig extension instead of registering twig function at runtime * fix tests --- DependencyInjection/NelmioApiDocExtension.php | 3 +++ Render/Html/GetNelmioAsset.php | 24 +++++++++---------- Render/Html/HtmlOpenApiRenderer.php | 5 +--- Render/RenderOpenApi.php | 4 ++++ Resources/config/services.xml | 5 ++-- Resources/views/SwaggerUi/index.html.twig | 12 +++++----- Tests/Render/Html/GetNelmioAssetTest.php | 6 +++-- 7 files changed, 33 insertions(+), 26 deletions(-) diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index 2b868b4..460aadb 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -155,6 +155,9 @@ final class NelmioApiDocExtension extends Extension implements PrependExtensionI $bundles = $container->getParameter('kernel.bundles'); if (!isset($bundles['TwigBundle'])) { $container->removeDefinition('nelmio_api_doc.controller.swagger_ui'); + + $container->removeDefinition('nelmio_api_doc.render_docs.html'); + $container->removeDefinition('nelmio_api_doc.render_docs.html.asset'); } if (isset($bundles['ApiPlatformBundle']) && class_exists('ApiPlatform\Core\Documentation\Documentation')) { $loader->load('api_platform.xml'); diff --git a/Render/Html/GetNelmioAsset.php b/Render/Html/GetNelmioAsset.php index a312899..be64283 100644 --- a/Render/Html/GetNelmioAsset.php +++ b/Render/Html/GetNelmioAsset.php @@ -12,17 +12,17 @@ namespace Nelmio\ApiDocBundle\Render\Html; use Symfony\Bridge\Twig\Extension\AssetExtension; +use Twig\Extension\AbstractExtension; use Twig\TwigFunction; /** * @internal */ -class GetNelmioAsset +class GetNelmioAsset extends AbstractExtension { private $assetExtension; private $resourcesDir; private $cdnUrl; - private $assetsMode = AssetsMode::BUNDLE; public function __construct(AssetExtension $assetExtension) { @@ -31,16 +31,16 @@ class GetNelmioAsset $this->resourcesDir = __DIR__.'/../../Resources/public'; } - public function toTwigFunction($assetsMode): TwigFunction + public function getFunctions() { - $this->assetsMode = $assetsMode; - - return new TwigFunction('nelmioAsset', $this, ['is_safe' => ['html']]); + return [ + new TwigFunction('nelmioAsset', $this, ['is_safe' => ['html']]), + ]; } - public function __invoke($asset) + public function __invoke($defaultAssetsMode, $asset) { - [$extension, $mode] = $this->getExtension($asset); + [$extension, $mode] = $this->getExtension($defaultAssetsMode, $asset); [$resource, $isInline] = $this->getResource($asset, $mode); if ('js' == $extension) { return $this->renderJavascript($resource, $isInline); @@ -51,15 +51,15 @@ class GetNelmioAsset } } - private function getExtension($asset) + private function getExtension($assetsMode, $asset) { $extension = mb_substr($asset, -3, 3, 'utf-8'); if ('.js' === $extension) { - return ['js', $this->assetsMode]; + return ['js', $assetsMode]; } elseif ('png' === $extension) { - return ['png', AssetsMode::OFFLINE == $this->assetsMode ? AssetsMode::CDN : $this->assetsMode]; + return ['png', AssetsMode::OFFLINE == $assetsMode ? AssetsMode::CDN : $assetsMode]; } else { - return ['css', $this->assetsMode]; + return ['css', $assetsMode]; } } diff --git a/Render/Html/HtmlOpenApiRenderer.php b/Render/Html/HtmlOpenApiRenderer.php index 78577f1..39d844c 100644 --- a/Render/Html/HtmlOpenApiRenderer.php +++ b/Render/Html/HtmlOpenApiRenderer.php @@ -28,13 +28,12 @@ class HtmlOpenApiRenderer implements OpenApiRenderer /** @var GetNelmioAsset */ private $getNelmioAsset; - public function __construct($twig, GetNelmioAsset $getNelmioAsset) + public function __construct($twig) { if (!$twig instanceof \Twig_Environment && !$twig instanceof Environment) { throw new InvalidArgumentException(sprintf('Providing an instance of "%s" as twig is not supported.', get_class($twig))); } $this->twig = $twig; - $this->getNelmioAsset = $getNelmioAsset; } public function getFormat(): string @@ -49,8 +48,6 @@ class HtmlOpenApiRenderer implements OpenApiRenderer 'swagger_ui_config' => [], ]; - $this->twig->addFunction($this->getNelmioAsset->toTwigFunction($options['assets_mode'])); - return $this->twig->render( '@NelmioApiDoc/SwaggerUi/index.html.twig', [ diff --git a/Render/RenderOpenApi.php b/Render/RenderOpenApi.php index 46b1ae1..b561fa6 100644 --- a/Render/RenderOpenApi.php +++ b/Render/RenderOpenApi.php @@ -33,6 +33,10 @@ class RenderOpenApi { $this->generatorLocator = $generatorLocator; foreach ($openApiRenderers as $openApiRenderer) { + if (null === $openApiRenderer) { + continue; + } + $this->openApiRenderers[$openApiRenderer->getFormat()] = $openApiRenderer; } } diff --git a/Resources/config/services.xml b/Resources/config/services.xml index 3caaba4..9d2c38c 100644 --- a/Resources/config/services.xml +++ b/Resources/config/services.xml @@ -28,16 +28,17 @@ - + - + + diff --git a/Resources/views/SwaggerUi/index.html.twig b/Resources/views/SwaggerUi/index.html.twig index a1b3129..a711c25 100644 --- a/Resources/views/SwaggerUi/index.html.twig +++ b/Resources/views/SwaggerUi/index.html.twig @@ -14,8 +14,8 @@ file that was distributed with this source code. #} {% block title %}{{ swagger_data.spec.info.title }}{% endblock title %} {% block stylesheets %} - {{ nelmioAsset('swagger-ui/swagger-ui.css') }} - {{ nelmioAsset('style.css') }} + {{ nelmioAsset(assets_mode, 'swagger-ui/swagger-ui.css') }} + {{ nelmioAsset(assets_mode, 'style.css') }} {% endblock stylesheets %} {% block swagger_data %} @@ -54,7 +54,7 @@ file that was distributed with this source code. #}
{% block header %} {% endblock header %}
@@ -64,11 +64,11 @@ file that was distributed with this source code. #} {% endblock %} {% block javascripts %} - {{ nelmioAsset('swagger-ui/swagger-ui-bundle.js') }} - {{ nelmioAsset('swagger-ui/swagger-ui-standalone-preset.js') }} + {{ nelmioAsset(assets_mode, 'swagger-ui/swagger-ui-bundle.js') }} + {{ nelmioAsset(assets_mode, 'swagger-ui/swagger-ui-standalone-preset.js') }} {% endblock javascripts %} - {{ nelmioAsset('init-swagger-ui.js') }} + {{ nelmioAsset(assets_mode, 'init-swagger-ui.js') }} {% block swagger_initialization %}