В Symfony Сервис-Контейнер создается с использованием одного ресурса конфигурации (по умолчанию это файл config/services.yaml). Это дает вам абсолютную гибкость по отношению к настройкам сервисов в приложении.
Добавить новые конфиги с помощью imports.
По умолчанию конфигурация службы находится в config/services.yaml. Но если этот файл становится большим, вы можете организовать несколько файлов. Предположим, вы решили перенести некоторую конфигурацию в новый файл:
# config/services/mailer.yaml
parameters:
# ... some parameters
services:
# ... some services
Чтобы импортировать этот файл, используйте ключ imports из любого другого файла и укажите относительный или абсолютный путь к импортированному файлу:
# config/services.yaml
imports:
- { resource: services/mailer.yaml }
services:
_defaults:
autowire: true
autoconfigure: true
public: false
App\:
resource: '../src/*'
exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'
# ...
При загрузке файла конфигурации, Symfony сначала загружает импортированные файлы, а затем обрабатывает параметры и сервисы, определенные в этом файле. Если вы используете конфигурацию services.yaml по умолчанию, как в приведенном выше примере, App\ создает сервисы для классов, найденных в ../src/*. Если ваш импортированный новый конфиг-файл также определяет сервисы для этих классов, то они будут переопределены.
Возможное решение для этого — добавить классы и/или каталоги импортированных файлов в опцию exclude в определении App\ . Другое решение состоит в том, чтобы не использовать импорт и добавлять определения сервисов в тот же файл, но после определения App\ переопределить его.
Из-за способа резолва параметров их нельзя использовать для динамического построения путей при импорте новых конфиг-фалов. Это означает, что что-то вроде следующего не будет работать:
# config/services.yaml
imports:
- { resource: '%kernel.project_dir%/somefile.yaml' }