【问题标题】:How to hide Api-plaform Docs from Nelmio Docs如何从 Nelmio Docs 中隐藏 Api-platform Docs
【发布时间】:2019-08-09 20:06:21
【问题描述】:

我希望有人可以帮助我将 Api 平台与 Nelmio 一起使用。

我使用 Api 平台和 Nelmio。我需要对 Nelmio 隐藏 Api 平台文档。

我需要 3 条路线:

/internal -> API-Platform Docs
/external -> NELMIO-Docs
/admin -> NELMIO-Docs

我的 Nelmio 配置:

# config/packages/nelmio_api_doc.yaml
nelmio_api_doc:
    documentation:
        info:
            title: ...
            description: ...
            version: 0.2.0
    areas: # to filter documented areas
        default:
            path_patterns: [ ^/external ]
        external:
            path_patterns: [ ^/external ]
        admin:
            path_patterns: [ ^/admin ]

我的 Nelmio 配置(路由):

# config/routes/nelmio_api_doc.yaml
app.swagger:
    path: /{area}/json
    methods: GET
    defaults: { _controller: nelmio_api_doc.controller.swagger, area: default }

app.swagger_ui:
    path: /{area}
    methods: GET
    defaults: { _controller: nelmio_api_doc.controller.swagger_ui, area: default }

我的 API 平台配置:

# config/routes/api_platform.yaml
api_platform:
    resource: .
    type: api_platform
    prefix: /internal/

但是如果我去http://localhost/externalhttp://localhost/admin 我总是看到不仅需要的路线,还有来自API-Platform的路线:

【问题讨论】:

  • 你找到解决方法了吗?
  • @krut1:你找到解决问题的方法了吗?我也是这种情况
  • 嗨@No_or_yes,不:我们没有找到任何解决方案:(

标签: symfony symfony4 api-platform.com api-doc nelmioapidocbundle


【解决方案1】:

我知道这个问题现在已经过时了,但我面临同样的情况,我找到了一种可能对某些人有帮助的解决方法,所以我发布了它。

API 平台允许您装饰 Swagger,以便您可以自定义最终文档输出。我利用这一点在不要求时摆脱了整个 api 平台文档。

<?php

namespace App\Swagger;

use Symfony\Component\HttpFoundation\RequestStack;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;

final class SwaggerDecorator implements NormalizerInterface
{
    private $decorated;
    private $requestStack;

    public function __construct(NormalizerInterface $decorated, RequestStack $requestStack)
    {
        $this->decorated = $decorated;
        $this->requestStack = $requestStack;
    }

    public function normalize($object, $format = null, array $context = [])
    {
        if ('/internal/docs' !== $this->requestStack->getCurrentRequest()->getPathInfo()) {
            // request is not for internal docs (maybe it is for external or admin one) so get rid of api platform docs
            return null;
        }

        $docs = $this->decorated->normalize($object, $format, $context);

        // here you can customize documentation

        return $docs;
    }

    public function supportsNormalization($data, $format = null)
    {
        return $this->decorated->supportsNormalization($data, $format);
    }
}

我希望这对某人有所帮助,编码愉快!


更新

为了启用该装饰器,您必须在您的服务文件中声明它:

App\Swagger\SwaggerDecorator:
        decorates: 'api_platform.swagger.normalizer.api_gateway'
        arguments: [ '@App\Swagger\SwaggerDecorator.inner' ]
        autoconfigure: false

然后,在类本身中,将 '/internal/docs' 替换为您用于 API 平台文档的实际 URL。

希望这会有所帮助。

【讨论】:

  • 您能否详细介绍一下您的解决方案?
  • 我更新了解决方案,希望对@No_or_yes有帮助
【解决方案2】:

在您的 nelmio 配置 yaml 文件中,使用正则表达式排除文档。例如,要排除/external/doc,您应该:

 external:
            path_patterns: [ ^/external(?!/doc$) ]

【讨论】:

  • 当您想排除路径中“第二个位置”的内容时,此方法有效。您的示例将仅删除 /external/doc,但如果您想删除整个 /external,它似乎不起作用。
  • path_patterns: [^/external]
  • 这应该只包括以/external 开头的所有内容,不幸的是它对我不起作用。
  • 如果您只想包含以 /external 开头的所有内容,则不需要 path_patherns,只需使用前缀:/external/
  • 显然存在错误或其他问题,因为这不起作用。我将 API 平台用于我们的部分端点,它们都以 /v1 为前缀,我无法将它们从 Nelmio 文档中排除。到目前为止,我发现的唯一解决方案是完全禁用 API 平台上的文档。
猜你喜欢
  • 2019-02-08
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-01
  • 2011-03-30
  • 1970-01-01
相关资源
最近更新 更多