Как отключить интерфейс Nelmio в производстве?

Есть ли способ отключить все документы по интерфейсу пользователя Nelmio Swagger? В производственном процессе я хочу, чтобы внешний мир ничего не видел по следующим URL, но в dev они должны отображать полезные документы и песочницу как обычно:

Кажется, в конфиге Nelmio должен быть легкий переключатель для этого, но я его не нашел. Моя компания использует пакет документов Nelmio API Doc в Symfony для разработки API для непубличного API. Сервер API общедоступен, но мы не заинтересованы публиковать его использование в мире.

5 ответов

Решение

Комментарий @gp_sflover направил меня на правильный путь, но это больше, чем просто отключение NelmioApiDocBundle в prod в AppKernel.php, Конфиги и маршруты, относящиеся к Nelmio, будут генерировать ошибки до тех пор, пока вы не переместите их в файлы, относящиеся к dev. Следующее изменение в app/AppKernel.php был первый шаг:

public function registerBundles()
{
    $bundles = [
        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),
        ...
        // new Nelmio\ApiDocBundle\NelmioApiDocBundle(), // <-- REMOVED FROM HERE
        new Nelmio\CorsBundle\NelmioCorsBundle(),
        new AppBundle\AppBundle(),
    ];

    if (in_array($this->getEnvironment(), ['dev', 'test'], true)) {
        $bundles[] = new Nelmio\ApiDocBundle\NelmioApiDocBundle(); // <-- ADDED HERE
        $bundles[] = new Symfony\Bundle\DebugBundle\DebugBundle();
        ...

Чтобы устранить ошибки конфигурации, мне пришлось переместить следующие вещи из app/config/config.yml и в config_dev.yml:

# nelmio Configuration
nelmio_api_doc:
    sandbox:
        enabled: true
    name: 'DLAP API Bridge'
    swagger:
        ...
    cache:
        enabled: false

Кроме того, следующий материал вышел из app/config/routing.yml и переехал в routing_dev.yml:

NelmioApiDocBundle:
    resource: "@NelmioApiDocBundle/Resources/config/routing.yml"
    prefix:   /api/doc

nelmio_api_swagger:
    resource: "@NelmioApiDocBundle/Resources/config/swagger_routing.yml"
    resource: null
    prefix: /api-docs

Теперь с symfony4 и flex вы можете установить пакет как обычно

composer require nelmio/api-doc-bundle

(Так что он не будет установлен как require-dev Депансия в вашем composer.json)

Теперь вы измените настройку в project/config/bundles.php чтобы:

Nelmio\ApiDocBundle\NelmioApiDocBundle::class => ['dev' => true]

Таким образом, вы не получите ошибки (например, из аннотаций), но он не будет загружен из Kernel.php

Для отключения пакета Nelmio api-doc-bundle в определенной среде после некоторого расследования я сделал следующее:

  • включите пакет только в вашей целевой среде, т.е. project/config/bundles.phpимеют:
      Nelmio\ApiDocBundle\NelmioApiDocBundle::class => ['dev' => true]
  • поместите аннотацию конфигурации для конкретной среды (поместите внутри ./config/packages/dev/)
  • поместите файл маршрута nelmio_api_doc.yamlвнутри ./config/routes/dev(вместо того, чтобы быть в ./config/routes), в противном случае, если вы вызовете маршрут для другой среды, в которой не загружен пакет, вместо 404 вы увидите 500)

Отсутствие загрузки пакета в config/bundles.php вызывает исключение в Symfony 4.3 с NelmioApiDocBundle версии 3:

There is no extension able to load the configuration for "nelmio_api_doc" 

В итоге я отключил маршрут для документов api с перенаправлением в среде, которую нужно было отключить (prod):

#config/routes/prod/nelmio_api_doc.yaml
app.swagger:
    path: /api/doc.json
    methods: GET
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /
        permanent: true

app.swagger_ui:
    path: /api/doc
    methods: GET
    defaults:
        _controller: FrameworkBundle:Redirect:urlRedirect
        path: /
        permanent: true

Вы также можете отключить песочницу, используя конфигурацию пользовательского интерфейса Swagger при выгрузке html-файла через консоль.

      $ php bin/console nelmio:apidoc:dump --format=html --html-config '{"assets_mode":"offline","server_url":"https://example.com","swagger_ui_config":{"supportedSubmitMethods":[]}}' > api.html

Документы:

https://symfony.com/bundles/NelmioApiDocBundle/current/commands.html

Сваггер:

https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration

Другие вопросы по тегам