使用Doctrine2和Symfony2的服务对象

时间:2011-10-06 10:51:05

标签: doctrine-orm symfony

我正在开发一个Symfony2 / Doctrine2项目,该项目在MSSqlServer上处理2个数据库。

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

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

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

所以我认为服务可能是满足我需求的最佳方式。但它并不清楚我是如何实现这一目标的。我的意思是,在哪里放置我的服务类,如何在config.yml中定义它,如何进入 people 实体......

我希望建立一个完整的服务(假设它是最好的实现)来执行类似的事情:

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

如果教条的服务实施不是最佳实践,那么它会是什么以及如何使其发挥作用?

1 个答案:

答案 0 :(得分:0)

您所问的可能只使用实体 - 只要您在Form实体上定义这样的关系:

/**
 * @OneToMany(targetEntity="Form", mappedBy="User")
 */
protected $Forms;

在用户实体上:

/**
 * @ManyToOne(targetEntity="User", inversedBy="Forms")
 */
protected $User;

然后您只需加载用户实体(通过服务,存储库或您希望的那样),然后通过$userObj->Forms访问属于该用户的所有表单(如果在您的实体上使用magic __get,如果不是然后使用getter方法,再次根据您的喜好)。 Forms是实现Doctrine\Common\Collections\Collection接口的对象的实例(因为它是一个多对多关系),可以使用foreach迭代。

在我使用Doctrine2的项目中,我们通常使用我们的服务来获取,保存和删除实体,以及列出类型的实体(我们称之为索引方法)。这样,您可以配合保存所需的额外功能,例如更新密切关联的其他实体等。这些服务与持久层相关联,并包含对实体管理器的引用,使实体本身处于隔离和可测试状态。

我们还有一个论点,即是否将这种逻辑放在存储库或服务中,但这更多的是个人偏好和/或项目要求。

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