Как импортировать файлы/ресурсы конфигурации
Дата обновления перевода 2025-09-21
Как импортировать файлы/ресурсы конфигурации
Tip
В этом разделе, файлы конфигурации сервиса называются ресурсами. В то время, как большинство ресурсов конфигурации являются файлами (например, YAML, XML, PHP), Symfony может загрузить конфигурацию откуда угодно (например, DB или даже внешнего веб-сервера).
Сервис-контейнер построен с использованием одного ресурсва конфигурации
(app/config/config.yml
по умолчанию). Вся другая конфигурация сервиса
(включая базовую конфигурацию Symfony и конфигурацию сторонних пакетов)
должна быть так или иначе импортирована изнутри этого файла. Это даёт вам
абсолютную гибкость с сервисами в вашем приложении.
Внешняя конфигурация сервиса может быть импортирована двумя разными способами.
Первый метод, зачастую используемый для импорта других ресурсов, это через директиву
imports
. Второй метод, используя расширения внедрения зависимости, используется
сторонними пакетами для загрузки конфигурации. Читайте дальше, чтобы узнать больше
о обоих методах.
Испорт конфигурации с помощью 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 сначала обрабатывает все импортированные файлы в
порядке, в котором они перечислены под ключом imports
. После обработки всех импортов
она обрабатывает параметры и сервисы, определенные непосредственно в текущем файле. На
практике это означает, что более поздние определения переопределяют предыдущие.
Например, если вы используете конфигурацию services.yaml по умолчанию
как в примере выше, ваш главный файл config/services.yaml
использует пространство
имен App\
для автоматического обнаружения сервисов и загружает их после всех импортированных
файлов. Если импортированный файл (например, config/services/mailer.yaml
) определяет
сервис, который также обнаруживается автоматически, определение из services.yaml
будет
иметь приоритет.
- Исключение сервисов из автоматического обнаружения
- Переоопределение сервисов в том же файле
- Контроль порядка импорта
Исключение сервисов из автоматического обнаружения
Настройте определение App\
для использования опции exclude
. Это предупреждает
автоматическую регистрацию Symfony классов, которые определены вручную в другом месте:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# config/services.yaml
imports:
- { resource: services/mailer.yaml }
# ... другие импорты
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
exclude:
- '../src/Mailer/'
- '../src/SpecificClass.php'
Переоопределение сервисов в том же файле
Вы можете определеить конкретные сервисы после блока автоматического обнаружения
App\
в том же файле. Эти более поздние определения заменять автоматически
зарегистрированные:
1 2 3 4 5 6 7 8 9 10 11
# config/services.yaml
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../src/*'
App\Mailer\MyMailer:
arguments: ['%env(MAILER_DSN)%']
Контроль порядка импорта
Переместите конфигурацию автоматического обнаружения App\
в отдельный файл и импортируйте
его перед более конкретными файлами сервисом. Таким образом конкретные определения сервисов
могут заменить автоматически обнаруженные.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
# config/services/autodiscovery.yaml
services:
_defaults:
autowire: true
autoconfigure: true
App\:
resource: '../../src/*'
exclude:
- '../../src/Mailer/'
# config/services/mailer.yaml
services:
App\Mailer\SpecificMailer:
# ... пользовательская конфигурация
# config/services.yaml
imports:
- { resource: services/autodiscovery.yaml }
- { resource: services/mailer.yaml }
- { resource: services/ }
services:
# определения тут переопределеяют все из импорта выше
# рассмотрите возможность оставить большинство определений внутри импортированных файлов
Дата обновления перевода 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
- и используется для дальнейшей конфигурации этих сервисов.