如何注入实例到容器中
在你的程序中使用容器时,有时你需要注入一个实例,而不是配置容器来创建一个新实例。
例如,如果你在使用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
相同的实例。