5.2 Определение сервиса

Чтобы заставить контейнер создавать некоторый объект в качестве сервиса - нужно прописать соответствующую конфигурацию в YAML, XML или PHP:

# app/config/config.yml
services:
    my_mailer:
        class: Acme\HelloBundle\Mailer
        arguments: [sendmail]

Экземпляр объекта Acme\HelloBundle\Mailer теперь можно получить через контейнер служб. А сам контейнер доступен в любом контроллере Symfony2 при помощи вспомогательного метода get():

$mailer = $this->get('my_mailer');
$mailer->send('indo@doninter.ru', ... );

Когда запрашивается сервис my_mailer, контейнер создаёт его объект и возвращает его. Таким образом сервис не создаётся вплоть до того момента, когда он будет нужен вам. А сервисы, которые не используются - не будут созданы.

Контейнер сервисов создаётся с использованием одного конфигурационного ресурса (app/config/config.yml). Все прочие ресурсы для сервисов должны импортироваться. Существует два способа импорта конфигураций контейнера:

  • Директива "imports" внутри config.yml
    # app/config/config.yml
    imports:
    hello_bundle:
        resource: @AcmeHelloBundle/Resources/config/services.yml
    
  • Расширения контейнера (Container Extensions)

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

    Расширение контейнера сервисов - это PHP класс, созданный для выполнения следующих функций:

    • Импорт всех ресурсов контейнера сервисов, необходимых для конфигурации всех служб бандла;
    • Предоставление простой и понятной конфигурации, при помощи которой пакет можно настроить, не взаимодействуя напрямую с конфигурацией контейнера сервисов пакета.

    http://blog.doninter.ru/konfiguraciya-bandla-cherez-extension-klass