Як імпортувати файли/джерела конфігурації
Дата оновлення перекладу 2023-06-15
Як імпортувати файли/джерела конфігурації
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 спочатку завантажує імпортовані файли, а
потім обробляє параметри та сервіси, визначені у файлі. Якщо ви використовуєте
конфігурацію 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/packages/
передається розширенню
спорідненого з ним пакету - наприклад, FrameworkBundle
або TwigBundle
- і
використовується для подальшої конфігурації цих сервісів.