1

誰かが Nelmio で Api-plator を使用するのを手伝ってくれることを願っています。

私は Api-platform と 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/externalまたはhttp://localhost/adminにアクセスすると、必要なルートだけでなく、API プラットフォームからのルートも常に表示されます。

ここに画像の説明を入力

4

2 に答える 2

1

この質問はもう古いことはわかっていますが、同じ状況に直面しており、誰かを助ける可能性のある回避策を見つけたので、投稿しています。

API Platform を使用すると、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);
    }
}

これが誰かの役に立てば幸いです。幸せなコーディングを!


アップデート

そのデコレーターを有効にするには、services ファイルでそのように宣言する必要があります。

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

次に、クラス自体で、'/internal/docs'API プラットフォーム ドキュメントに使用している実際の URL に置き換えます。

お役に立てれば。

于 2020-07-06T08:39:32.270 に答える