使用symfony DI延迟加载依赖项

时间:2012-07-10 22:02:46

标签: symfony dependency-injection

目前我已经准备好了一个服务及其所有依赖项的Symfony2 DI容器实例。让我们说例如我有一个Car类,它有Engine和Lights作为依赖项。

在我当前的设置中,这两个依赖关系是在创建Car对象时通过setter注入自动创建的,但很可能这次我的Car对象不需要它的灯光因此它没有明确需要创建此依赖项的实例。

有没有办法在Symfony DI中实现这一目标?因此,只在需要时才创建Lights对象的实例?我猜这是像Doctrine那样的某种代理实现,但据我所知,它在Symfony DI中不存在。

3 个答案:

答案 0 :(得分:2)

问题已经得到解答,但对于谁需要此功能,延迟服务在Symfony 2.3中实现。

您需要安装ProxyManager bridge

您可以找到官方文档here

答案 1 :(得分:1)

一个非常有趣的问题,但我不认为它可能在Symfony2的依赖注入容器中。容器只知道你告诉它的内容 - 在这种情况下,你有一个依赖于特定用例的依赖。此外,服务注册发生在应用程序的早期,所以我不知道如何让它工作。

也许您应该使用Factory模式。将CarFactory注册为服务,然后在获取Car实例时,您可以指定它应包含Light依赖项。

我可以问你为什么要这样做吗?可能有一个更简单的解决方案。

答案 2 :(得分:0)

这不是一个很好的解决方法,但您可以尝试注入整个DIC,然后在必要时获取Light和Engine服务。

我在考虑Car类中的这种方法:

protected function getLightService() 
{
    if (!$this->light) {  //so we reuse the first instance
        $this->light = $this->dic->get("car.light");
    }

    return $this->light;
}