Как внедрять экземпляры в контейнер

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

Например, сервис kernel в Symfony внедряется в контейнер из класса Kernel:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
// ...
abstract class Kernel implements KernelInterface, TerminableInterface
{
    // ...

    protected function initializeContainer()
    {
        // ...
        $this->container->set('kernel', $this);

        // ...
    }
}

Сервисы, которые устанавливаются во время прогона, называюся синтетическими сервисами. Такой сервис должне быть сконфигурирован, чтобы во время компиляции контейнер знал, что он существует (иначе, сервисы, зависящие от kernel получат ошибку "сервис не существует").

Для того, чтобы сделать это, пометьте сервис, как синтетический, в вашей конфигурации определения сервиса:

  • YAML
    1
    2
    3
    4
    5
    services:
    
        # синтетические сервисы не указывают класс
        app.synthetic_service:
            synthetic: true
    
  • XML
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    <?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">
    
        <services>
    
            <!-- синтетические сервисы не указывают класс -->
            <service id="app.synthetic_service" synthetic="true" />
    
        </services>
    </container>
    
  • PHP
    1
    2
    3
    4
    // синтетические сервисы не указывают класс
    $container->register('app.synthetic_service')
        ->setSynthetic(true)
    ;
    

Теперь вы можете внедрять экземпляр в контейнер, используя метод Container::set():

1
2
3
// инстанциируйте синтетический сервис
$theService = ...;
$container->set('app.synthetic_service', $theService);

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