Як впроваджувати екземпляри у контейнер

Дата оновлення перекладу 2022-11-25

Як впроваджувати екземпляри у контейнер

У деяких додаткам вам може знадобитися впровадити екземпляр класу як сервіс, замість того, щоб конфігурувати контейнер так, щоб він створив новий екземпляр.

Наприклад, сервіс kernel у Symfony впроваджується у контейнер з класу Kernel:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// ...
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\HttpKernel\TerminableInterface;

abstract class Kernel implements KernelInterface, TerminableInterface
{
    // ...

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

        // ...
    }
}

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

Для того, щоб зробити це, відмітьте сервіс як синтетичний у вашій конфігурації визначення сервісу:

  • YAML
  • XML
  • PHP
1
2
3
4
5
# config/services.yaml
services:
    # синтетичні сервіси не визначають клас
    app.synthetic_service:
        synthetic: true

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

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