Як імпортувати файли/джерела конфігурації

Дата оновлення перекладу 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 - і використовується для подальшої конфігурації цих сервісів.