gpt4 book ai didi

doctrine-orm - 使用 Doctrine2 和 Symfony2 的服务对象

转载 作者:行者123 更新时间:2023-12-03 11:11:33 24 4
gpt4 key购买 nike

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

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

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

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

所以我决定服务可能是满足我需求的最佳方式。但我不清楚如何真正做到这一点。我的意思是,在哪里放置我的服务类,如何在 config.yml 中定义它,如何进入实体...

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

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

如果原则的服务实现不是最佳实践,那么它会是什么?我如何才能让它发挥作用?

最佳答案

您要问的是可以单独使用实体 - 只要您在 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 的对象实例接口(interface)(因为它是一对多关系),可以使用 foreach 进行迭代。

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

我们也曾争论过是否将这种逻辑放在存储库或服务中,但这更多是个人偏好和/或项目要求的情况。

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

关于doctrine-orm - 使用 Doctrine2 和 Symfony2 的服务对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7673270/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com