【问题标题】:Inject specific Doctrine entity in Symfony2 service在 Symfony2 服务中注入特定的 Doctrine 实体
【发布时间】:2014-05-02 13:45:33
【问题描述】:

我目前在服务中使用具有特定 ID 的实体。为了使用依赖注入来完成这项工作,我正在注入实体存储库和特定 ID。例如:

public function __construct($myRepo, $myId) {
    $this->myEntity = $myRepo->find($myId);
}

有没有办法直接注入这个特定的实体而不传入存储库?例如,理想的方法是:

public function __construct($myEntity) {
    $this->myEntity = $myEntity;
}

我不知道如何定义执行此操作所需的服务。

【问题讨论】:

    标签: php symfony dependency-injection doctrine-orm


    【解决方案1】:

    服务应该是无状态的。在服务中保存具有特定 ID 的用户会使他们成为有状态的。

    与其在构造函​​数中传递实体并将其保存在属性中,不如将实体传递给被调用的方法。例如。而不是将to 地址传递给构造函数的邮件程序,它应该传递给mailer#mail() 方法。

    【讨论】:

    • 非常好,让它们保持无状态是有意义的。但是,我不确定如何将我需要的特定实体注入到使用它的方法中,因为它是一个受保护的方法。
    • 嗯,这个方法是从某个地方调用的……传到那个地方
    • 我想我没有关注你。该方法是从服务内部调用的,因此为了将其传递给该方法,服务需要知道它。
    【解决方案2】:

    @Wouter 很好地说明了服务是无状态的。但是,您可以使用 DI 工厂功能来实现您的目标:

    specific_entity:
        class:  SomeEntity # Not used but you still need something here
        factory_service:  specific_entity_repository
        factory_method:   find
        arguments:  
            - 42
    

    这将使用参数 42 调用存储库上的 find 方法。然后将注入返回的实体。我假设您已经知道如何将存储库设置为服务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多