Як імпортувати файли/джерела конфігурації
Дата оновлення перекладу 2025-09-21
Як імпортувати файли/джерела конфігурації
Tip
У цьому розділі, файли конфігурації називаються джерелами. В той час, як більшість джерел конфігурації є файлами (наприклад, YAML, XML, PHP), Symfony може завантажити конфігурацію звідки завгодно (наприклад, з БД або навіть зовнішнього сервера).
Сервіс-контейнер побудовано з використанням одного джерела конфігурації
(app/config/config.yml за замовчуванням). Це надає вам абсолютну гнучкість у
сервісах у вашому додатку.
Зовнішня конфігурація сервісу може бути імпортована двома різними способами. Перший
метод, часто використовуваний для імпроту інших джерел, це через директиву imports.
Другий метод, використовуючи розширення впровадження залежності, використовується
сторонніми пакетами для завантаження конфігурації. Читайте далі, щоб дізнатися більше
про обидва методи.
Імпорт конфігурації з imports
За замовчуванням, конфігурація сервісу живе у app/config/services.yml. Але якщо
цей файл стає більшим, ви можете спокійно реорганізувати його у декілька файлів. Уявіть,
що ви вирішили перемістити якусь частину конфігурації у новий файл:
1 2 3 4 5 6
# config/services/mailer.yaml
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/packages/ передається розширенню
спорідненого з ним пакету - наприклад, FrameworkBundle або TwigBundle - і
використовується для подальшої конфігурації цих сервісів.