【问题标题】:Doctrine 2 with Symfony DI Container带有 Symfony DI 容器的 Doctrine 2
【发布时间】:2011-07-14 19:31:47
【问题描述】:

我正在开发一个利用 Doctrine 2 的 Zend Framework 项目。我正在尝试让 Symfony 的 DI 容器也与该项目一起工作,但我遇到了麻烦。假设我有一个需要注入两个实例的类“Foo”。我可以毫无问题地设置一个 Symfony DI 容器来获取一个注入了依赖项的新“Foo”。伟大的!但是现在如果我想让“Foo”成为一个 Doctrine 实体呢?当我将实体插入数据库时​​一切都很好,因为我可以从 DI 容器中获取一个新的并简单地保留实体。但是,当我从 DB Doctrine 查询实体时,正在实例化我的“Foo”实例,它们不会注入正确的依赖项。如何让 Doctrine 使用我的 DI 容器,以便实体具有适当的依赖项?我知道 Doctrine 提供了一个“postLoad”钩子,我可以用它来注入对我的实体的依赖项,但这违背了 DI 容器的目的和好处。

【问题讨论】:

    标签: symfony dependency-injection doctrine-orm


    【解决方案1】:

    Doctrine Entity 是新的,而不是可注射的。实体不应通过 DIC 创建。请参阅以下博客文章,了解 newable 和 injectionable 之间的区别:

    http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

    【讨论】:

      【解决方案2】:

      这有点棘手,但可以做到。 symfony di 容器有一个补丁,它允许您将一个已经存在的对象传递给容器构建器实例,并让 di 容器为您配置它(例如,基于接口注入依赖项)。该补丁在 github 上的这个存储库中实现:https://github.com/lstrojny/symfony 但没有使其成为 symfony 主存储库的上游。

      你可以这样使用它:

      $user = new User();
      $container->configure('someId', $user);
      

      然后您可以使用 Doctrine 的 EventManager 注册一个 PostLoad 事件处理程序(有关详细信息,请参见此处:http://www.doctrine-project.org/docs/orm/2.0/en/reference/events.html)。在此事件处理程序中,您可以通过上述方法配置加载的实体。这很明显,但在这种情况下你不能使用构造函数注入,只能使用 setter。

      这设置起来有点棘手,但可以非常强大,尤其是结合 symfony di 容器基于接口注入依赖项的能力。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-07
        • 1970-01-01
        • 2013-04-30
        • 1970-01-01
        • 2018-04-26
        • 2012-04-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多