【问题标题】:Lazy loading dependencies with symfony DI使用 symfony DI 延迟加载依赖项
【发布时间】:2012-07-10 22:02:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: symfony dependency-injection


    【解决方案1】:

    通过您的 services.yml 自动通过构造函数注入必需的依赖关系。
    如果您有可选的依赖项,请在需要时通过 Controller 中的 setter 注入它们。

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

    当然,您的 Cars 类必须这样设计,并且您必须自己在控制器或任何需要的代码中指导注入。

    【讨论】:

      【解决方案2】:

      问题已经得到解答,但是对于需要此功能的人,Symfony 2.3 中实现了惰性服务。

      您需要安装ProxyManager bridge

      你可以找到官方文档here

      【讨论】:

        【解决方案3】:

        一个非常有趣的问题,但我认为在 Symfony2 的依赖注入容器中是不可能的。容器只知道你告诉它什么——在这种情况下,你有一个依赖于特定用例的依赖。另外,服务的注册是在应用生命周期的早期进行的,所以我看不出你如何让它工作。

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

        我能问一下你为什么要实现这个目标吗?可能有更简单的解决方案。

        【讨论】:

        • 好吧,在我的情况下,我正在将 DI 组件独立实施到一个较旧的 ZF 项目中。我有几个服务类(AdminService、UserService……),它们都具有 DBAL、ACL 等依赖项……这些是服务类正常运行的实际要求。另一方面,像 Form 和 Model 这样的实例仅在某些 ServiceClass 的方法中使用。这些是“条件”依赖项。我认为这也几乎是不可能的,除非 Symfony DI 有一个代理系统,比如学说用于它的实体。
        【解决方案4】:

        这不是一个很好的解决方法,但您可以尝试注入整个 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;
        }
        

        【讨论】:

        • 目前我没有注入 DI 容器,而是从 ZF FrontController 引用它,如下所示:Zend_Controller_Front::getInstance()->getParam('bootstrap')->getDic()。有什么理由不这样做?
        • 我对采埃孚没有经验,所以无法回答。如果它适合你,我想没关系。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 2020-02-04
        相关资源
        最近更新 更多