如何注入实例到容器中

3.4 版本
维护中的版本

在你的程序中使用容器时,有时你需要注入一个实例,而不是配置容器来创建一个新实例。

例如,如果你在使用HttpKernel组件,配合DependencyInjection组件,然后在kernel类里面,kernel服务被注入到容器中。

1
2
3
4
5
6
7
8
9
10
11
12
// ...
abstract class Kernel implements KernelInterface, TerminableInterface
{
    // ...
    protected function initializeContainer()
    {
        // ...
        $this->container->set('kernel', $this);
 
        // ...
    }
}

这时的kernel服务被称为合成服务(synthetic service)。这个服务只能在容器中配置,所以在编译的时候容器知道这个服务确实存在(否则,依赖这个kernel服务的其他服务会得到一个“service does not exist”服务不存在错误)。

为了实现这个,你必须使用Definition::setSynthetic()

1
2
3
4
5
6
7
8
use Symfony\Component\DependencyInjection\Definition;
 
// synthetic services don't specify a class
// 合成服务不必指定一个类
$kernelDefinition = new Definition();
$kernelDefinition->setSynthetic(true);
 
$container->setDefinition('your_service', $kernelDefinition);

现在,你可以注入这个实例到容器中,使用Container::set()

1
2
$yourService = new YourObject();
$container->set('your_service', $yourService);

$container->get('your_service')现在可以返回与$yourService相同的实例。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)