Как отключить интерфейс 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