Doctrine 2中代理、仓库和服务之间有什么区别?

7

我想知道这三种模式之间的区别。

据我所知:

  • 代理仅用于懒加载实体
  • 存储库用于向模型添加逻辑(具有一些快捷方式方法,用于DQL语句)
  • 服务用于依赖模型和控制器

对于最后一个服务来说,在Doctrine 2项目中,我不明白它背后的意义,因为存储库不知道持久系统的存在,因为它使用ORM与DBAL。

我读到代理可以用于向实体添加逻辑,那么它与存储库有什么区别?

顺便问一下,我的实体是否只应包含其属性的公共getter / setter?这正确吗?

我有点迷失了。

您有任何具体的示例吗?

1个回答

17

代理是指对某个对象的引用。

假设您正在创建用户,每个用户都有一个附加的组。如果没有代理支持,您需要在数据库上进行获取操作,才能使用实体。以下是可能的代码:

$group = $em->getRepository('Group')->findOneById(1);

支持代理后,您无需进行数据库查找。代理被视为对数据库中的内容的引用,而不是实际获取它。 您的代码:

$group = $em->getReference('Group', 1);
使用代理(Proxy)的好处很简单...如果您需要获取(例如)组名,只需像平常一样使用 $group->getName(); 然后代理将初始化实体(按需进行 DB 获取)。
仓库(Repository)是一个数据操作工具。您可以使用它来管理您的实体。因此,您可以通过 findById、findOneByEmail 等方式进行查询。您还可以扩展其基本功能并实现自己的方法来管理您的实体,例如:saveUser、retrieveMostActiveUsers。
服务(Service)在内部使用仓库,但它包含更多验证,并且可能与多个仓库交互。例如,在成功保存用户之后,您想向他发送祝贺电子邮件。因此,在 UserService 的 createUser 方法中,您检索 NotificationService 并分派新注册电子邮件。
现在清楚了吗?=)
干杯,

3
感谢您对NotificationService表示支持。它确实有助于理解服务(如UserService)与协作服务(如NotificationService)可以执行哪些操作。谢谢。;-) - David Weinraub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接