How to Inject Instances into the Container ¶
In some applications, you may need to inject a class instance as service, instead of configuring the container to create a new instance.
一部のアプリケーションでは、コンテナーを構成して新しいインスタンスを作成する代わりに、クラス インスタンスをサービスとして注入する必要がある場合があります。
For instance, the kernel
service in Symfony is injected into the container
from within the Kernel
class:
たとえば、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);
// ...
}
}
|
Services that are set at runtime are called synthetic services. This service
has to be configured so the container knows the service exists during compilation
(otherwise, services depending on kernel
will get a "service does not exist" error).
実行時に設定されるサービスは合成サービスと呼ばれます。このサービスは、コンテナーがコンパイル中にサービスが存在することを認識できるように構成する必要があります (そうしないと、カーネルに依存するサービスで「サービスが存在しません」というエラーが発生します)。
In order to do so, mark the service as synthetic in your service definition configuration:
これを行うには、サービス定義構成でサービスを合成としてマークします。
-
YAML
YAML
-
XML
XML
-
PHP
PHP
1 2 3 4 5 |
# config/services.yaml
services:
# synthetic services don't specify a class
app.synthetic_service:
synthetic: true
|
Now, you can inject the instance in the container using Container::set():
これで、Container::set() を使用してコンテナーにインスタンスを注入できます。
1 2 3 |
// instantiate the synthetic service
$theService = ...;
$container->set('app.synthetic_service', $theService);
|