2012-07-10 66 views
7

延迟加载依赖关系目前,我已经准备好了一个Symfony2 DI容器实例,并提供了一个服务以及它的所有依赖关系。比方说,例如,我有一个Car类,它具有Engine和Lights作为依赖关系。用symfony DI

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

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

回答

2

注入是通过您的services.yml是通过构造强制性dedendencies,自动。
如果你有可选的依赖关系,当你需要它们时,通过Controller中的setter注入它们。

$this->container->get('cars')->setLights(new \Namespace\Lights()); 

当然你的汽车类的设计必须像这样,你必须自己直接注射在你的控制器,或需要等。无论代号。

1

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

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

请问为什么要达到这个目标?可能有一个更简单的解决方案。

+0

那么在我的情况下,我正在将DI组件独立安装到一个较旧的ZF项目中。我有几个服务类(AdminService,UserService,...),它们都具有像DBAL,ACL等依赖项...这些是服务类正常运行的实际要求。另一方面,像Form和Model这样的实例只能在一些ServiceClass的方法中使用。这些是“条件”依赖关系。 我在想这也是几乎不可能的,除非Symfony DI有一个代理系统,像它的实体一样使用教条。 – ChrisR 2012-07-11 06:33:24

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; 
} 
+0

目前我没有注入DI容器,而是像这样从ZF FrontController引用它:'Zend_Controller_Front :: getInstance() - > getParam('bootstrap') - > getDic()'。任何理由不这样做? – ChrisR 2012-07-11 11:08:19

+0

我没有使用ZF的经验,所以我无法回答。如果它适合你,我想没关系。 – Maerlyn 2012-07-11 11:52:49

2

问题已经得到解答,但对于需要此功能的用户,懒惰服务在Symfony 2.3中实现。您需要安装ProxyManager bridge

你可以找到官方文档here