Doctrine orm 具有Doctrine2和Symfony2的服务对象

Doctrine orm 具有Doctrine2和Symfony2的服务对象,doctrine-orm,symfony,Doctrine Orm,Symfony,我正在从事一个Symfony2/Doctrine2项目,该项目处理MSSqlServer上的两个数据库 第一个数据库A_db有一个表格,第二个数据库B_db有人。我的所有实体都是用注释定义的 我需要从与人相关的表单中获取所有表单,我将在下面几行中解释 我花了一些时间阅读了相关的回答问题: 很可能是我需要的 当然是服务 服务/存储库/任何东西 因此,我决定服务可能是满足我需求的最佳方式。但我不清楚到底是怎么做到的。我的意思是,把我的服务类放在哪里,如何在config.yml中定义它,如何在人的

我正在从事一个Symfony2/Doctrine2项目,该项目处理MSSqlServer上的两个数据库

第一个数据库A_db有一个表格,第二个数据库B_db有人。我的所有实体都是用注释定义的

我需要从与人相关的表单中获取所有表单,我将在下面几行中解释

我花了一些时间阅读了相关的回答问题:

  • 很可能是我需要的
  • 当然是服务
  • 服务/存储库/任何东西
因此,我决定服务可能是满足我需求的最佳方式。但我不清楚到底是怎么做到的。我的意思是,把我的服务类放在哪里,如何在config.yml中定义它,如何在人的实体中

我希望建立一个完整的服务(假设它是最好的实现)来执行以下操作:

foreach($onePeple->getForms() as $form) {/* some code with form */}

如果条令的服务实现不是最佳实践,那么它会是什么,我如何才能使它工作?

您所要求的可以单独使用实体-只要您在表单实体上定义这样的关系:

/**
 * @OneToMany(targetEntity="Form", mappedBy="User")
 */
protected $Forms;
在用户实体上:

/**
 * @ManyToOne(targetEntity="User", inversedBy="Forms")
 */
protected $User;
然后,您可以简单地加载一个用户实体(通过服务、存储库或您希望的方式),然后通过
$userObj->forms
访问属于该用户的所有表单(如果使用magic,请访问您的实体,如果不使用,则使用getter方法,再次取决于您的偏好)
Forms
是实现
Doctrine\Common\Collections\Collection
接口的对象的实例(因为它是一种对多关系),可使用foreach实现该接口

在我使用Doctrine2的项目中,我们通常使用我们的服务获取、保存和删除实体,同时列出一种类型的实体(我们称之为索引方法)。通过这种方式,您可以绑定保存时所需的额外功能,例如更新密切关联的其他实体等。这些服务绑定到持久性层,并包含对实体管理器的引用,从而使实体本身保持隔离和可测试性

我们还讨论了是否将这种逻辑放在存储库或服务中,但这更多的是个人偏好和/或项目需求


需要注意的一点是,您构建的服务不会与原则相关联。它不知道您的服务层(它只是一些用户区代码),因此您需要以有意义和干净的方式链接它。本质上,您希望通过服务的构造函数传递实体管理器,并拥有某种能够在所有实体上运行的基本服务类,然后可以在每个实体的基础上使用特殊逻辑对其进行扩展。然而,存储库本质上是与理论联系在一起的,所以如果这是您想要的,那么它可能是最好的解决方案。我们倾向于使用服务,因为它们与实现业务规则等完全相关,而将存储库作为持久性层的一个组件使用。

谢谢!但我已经考虑过使用关联映射,但没有得到好的结果。这里的问题是,我谈论的是不同数据库上的表,这意味着不同的连接配置,当然还有不同的实体管理器。当尝试使用get/set方法时,我得到一个错误,告诉我“forms Obj不存在”,因为在该连接配置中(B_db中的一个)表表单和映射表单不存在。我的服务业务是,我可以处理这两个$em,这样我就可以进行复杂的查询,从与B_数据库中每个用户相关的A_数据库获取表单。对吧?也许我不理解你的建议。我认为条令并不真正支持通过多个数据库进行关联映射。Doctrine博客上的这篇文章:似乎可以“很好”地工作。但由于我无法更改一个数据库列的名称,我甚至无法对其进行测试,然后我又回到了服务提案和我的第一个问题:如何让服务与条令2一起工作?好吧,这是一个巨大的难题,多个数据库的配置使它变得复杂。服务不是你“开始工作”的东西——它们是你创建、实例化(像任何其他类一样)、利用的类。您所需要做的就是传入实体管理器,并在其中编写一些代码以达到所需的目的-使用实体管理器获取,等等。在您的情况下,如果必须传入两个实体管理器,那么这就是您必须做的。好的,现在我回到我的原始问题。如何定义服务?如何实例化它们?如何在一个实体方法getForms()中调用它们?我有点搞不清楚应该把它们放在哪里,配置config.yml等等……您不应该从实体中获取服务。可以这样想-实体本身是一个数据存储,操作在数据范围内。您可以绑定与实体本身域相关的验证功能、计算功能等。您的
getForms()
方法不是直接对实体的操作-因为它访问的是完全不同的模型(一个单独的、预先存在的数据库),所以它是服务级别的。服务是在实体上运行或使用实体的东西,这是您的需求。