Как импортировать файлы/ресурсы конфигурации

Tip

В этом разделе, файлы конфигурации сервиса называются ресурсами. В то время, как большинство ресурсов конфигурации являются файлами (например, YAML, XML, PHP), Symfony может загрузить конфигурацию откуда угодно (например, БД или даже внешнего веб-сервера).

Сервис-контейнер построен с использованием одного ресурсва конфигурации (app/config/config.yml по умолчанию). Вся другая конфигурация сервиса (включая базовую конфигурацию Symfony и конфигурацию сторонних пакетов) должна быть так или иначе импортирована изнутри этого файла. Это даёт вам абсолютную гибкость с сервисами в вашем приложении.

Внешняя конфигурация сервиса может быть импортирована двумя разными способами. Первый метод, зачастую используемый для импорта других ресурсов, это через директиву imports. Второй метод, используя расширения внедрения зависимости, используется сторонними пакетами для загрузки конфигурации. Читайте дальше, чтобы узнать больше о обоих методах.

Importing Configuration with imports

По умолчанию, конфигурация сервиса живёт в app/config/services.yml. Но если этот файл становится большим, вы можете спокойно реорганизовать его в несколько файлов. Представьте, что вы решили переместить какую-то часть конфигурации в новый файл:

  • YAML
    1
    2
    3
    4
    5
    6
    # app/config/services/mailer.yml
    parameters:
        # ... некоторые параметры
    
    services:
        # ... некоторые сервисы
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    <!-- app/config/services/mailer.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <parameters>
            <!-- ... some parameters -->
        </parameters>
    
        <services>
            <!-- ... some services -->
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    // app/config/services/mailer.php
    
    // ... некоторые параметры
    // ... некоторые сервисы
    

Для того, чтобы импортировать этот файл, используйте ключ imports из файла, который загружается:

  • YAML
    1
    2
    3
    # app/config/services.yml
    imports:
        - { resource: services/mailer.yml }
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    <!-- app/config/services.xml -->
    <?xml version="1.0" encoding="UTF-8" ?>
    <container xmlns="http://symfony.com/schema/dic/services"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://symfony.com/schema/dic/services
            http://symfony.com/schema/dic/services/services-1.0.xsd">
    
        <imports>
            <import resource="services/mailer.xml"/>
        </imports>
    </container>
    
  • PHP
    1
    2
    // app/config/services.php
    $loader->import('services/mailer.php');
    

Для файлов, локация resource - это либо относительный путь из текущего файла, либо абсолютный путь.

Испорт конфигурации через расширения контейнера

Конфигурация контейнера сторонних пакетов, включая базовые сервисы Symfony, обычно загружается с использованием другого метода: расширения контейнера.

Внутренне, каждый пакет определяет свои сервисы в файлах, как вы уже видели. Однако, эти файлы не испортируются, используя директиву import. Вместо этого, пакеты используют расширение внедрения зависимости, чтобы загружать файлы автоматически. Как только вы включаете пакет, вызывается его расширение, которое может загрузить файлы конфигурации сервиса.

На самом деле, каждый блок конфигурации в config.yml - например, framework или twig- передаётся расширению для этого пакета - например. FrameworkBundle или TwigBundle - и используется для дальнейшей конфигурации этих сервисов.

Если вы хотите использовать расширения внедрения зависимости в ваших собственных общественных пакетах и предоставлять удобную для пользователя конфигурацию, посмотрите статью How to Load Service Configuration inside a Bundle.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.