Как импортировать файлы/ресурсы конфигурации

Дата обновления перевода 2023-07-06

Как импортировать файлы/ресурсы конфигурации

Tip

В этом разделе, файлы конфигурации сервиса называются ресурсами. В то время, как большинство ресурсов конфигурации являются файлами (например, YAML, XML, PHP), Symfony может загрузить конфигурацию откуда угодно (например, DB или даже внешнего веб-сервера).

Сервис-контейнер построен с использованием одного ресурсва конфигурации (app/config/config.yml по умолчанию). Вся другая конфигурация сервиса (включая базовую конфигурацию Symfony и конфигурацию сторонних пакетов) должна быть так или иначе импортирована изнутри этого файла. Это даёт вам абсолютную гибкость с сервисами в вашем приложении.

Внешняя конфигурация сервиса может быть импортирована двумя разными способами. Первый метод, зачастую используемый для импорта других ресурсов, это через директиву imports. Второй метод, используя расширения внедрения зависимости, используется сторонними пакетами для загрузки конфигурации. Читайте дальше, чтобы узнать больше о обоих методах.

Importing Configuration with imports

По умолчанию, конфигурация сервиса живёт в app/config/services.yml. Но если этот файл становится большим, вы можете спокойно реорганизовать его в несколько файлов. Представьте, что вы решили переместить какую-то часть конфигурации в новый файл:

1
2
3
4
5
6
# app/config/services/mailer.yml
parameters:
    # ... некоторые параметры

services:
    # ... некоторые сервисы

Для того, чтобы импортировать этот файл, используйте ключ imports из файла, который загружается:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# config/services.yaml
imports:
    - { resource: services/mailer.yaml }
    # Если вы хотите импортировать весь каталог:
    - { resource: services/ }
services:
    _defaults:
        autowire: true
        autoconfigure: true

    App\:
        resource: '../src/*'
        exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

    # ...

При загрузке файла конфигурации, Symfony сначала загружает импортированные файлы, а затем обрабатывает параметры и сервисы, определенные в файле. Если вы используете конфигурацию services.yaml по умолчанию как в приведенном выше примере, определение App\ создает сервисы для классов, найденных в ../src/*. Если ваш импортированный файл определяет сервисы для этих классов, то они будут переопределены.

Возможным решением этой проблемы является добавление классов и/или каталогов импортированных файлов в опцию exclude определения App\. Еще одно решение - не использовать импорт и добавить определения сервисов в тот же файл, но после определения App\, чтобы переопределить его.

Дата обновления перевода 2023-08-21

Note

В связи с тем, как разрешаются параметры, вы не можете использовать их для построения путей в импорте динамически. Это означает, что что-то вроде этого работать не будет:

1
2
3
# config/services.yaml
imports:
    - { resource: '%kernel.project_dir%/somefile.yaml' }

Импорт конфигурации через расширения контейнера

Конфигурация контейнера сторонних пакетов, включая базовые сервисы Symfony, обычно загружается с использованием другого метода: расширения контейнера.

Внутренне, каждый пакет определяет свои сервисы в файлах, как вы уже видели. Однако, эти файлы не испортируются, используя директиву import. Вместо этого, пакеты используют расширение внедрения зависимости, чтобы загружать файлы автоматически. Как только вы включаете пакет, вызывается его расширение, которое может загрузить файлы конфигурации сервиса.

На самом деле, каждый блок конфигурации в config.yml - например, framework или twig- передаётся расширению для этого пакета - например. FrameworkBundle или TwigBundle - и используется для дальнейшей конфигурации этих сервисов.