Як впроваджувати екземпляри у контейнер
Дата оновлення перекладу 2024-06-05
Як впроваджувати екземпляри у контейнер
У деяких додаткам вам може знадобитися впровадити екземпляр класу як сервіс, замість того, щоб конфігурувати контейнер так, щоб він створив новий екземпляр.
Наприклад, сервіс 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
, отримають помилку "сервіс не існує").
Для того, щоб зробити це, відмітьте сервіс як синтетичний у вашій конфігурації визначення сервісу:
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);