Doctrine 2中的代理,存储库和服务有什么区别?

时间:2011-03-06 12:30:18

标签: model doctrine-orm data-modeling

我想知道这三种模式之间有什么区别。

据我所知:

  • 代理仅用于延迟加载实体
  • 存储库用于向模型添加逻辑(宽度为DQL语句的一些快捷方法)
  • 服务用于依赖模型和控制器

对于最后这个服务,我不知道它背后的Doctrine 2项目作为存储库不知道后面的持久系统,因为它使用ORM和DBAL。

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

顺便说一下,我的实体是否只包含公共getter / setter属性,只有那个?这是对的吗?

我有点迷失在这里。

你有什么具体的例子吗?

1 个答案:

答案 0 :(得分:17)

代理是对某事的引用。

假设您正在创建用户,并且一个用户附加了一个组。 如果您没有代理支持,则需要为该组执行数据库提取以便能够使用该实体。这是一个可能的代码:

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

支持Proxies,您无需进行数据库查找。代理被视为对DB事物的引用,而不实际获取它。你的代码:

$group = $em->getReference('Group', 1);

拥有代理的好处很简单......如果您需要获取(例如)组名称,只需正常执行:$ group-> getName();并且Proxy将初始化实体(按需提取数据库)。

存储库是一种数据操作的东西。您可以使用它来管理您的实体。所以你可以找到你的id,findOneByEmail等。你也可以扩展它的基本功能并实现管理你的实体的方法,比如:saveUser,retrieveMostActiveUsers。

服务在内部使用存储库,但它包含更多验证并可能与>进行交互。 1个存储库。例如,在您成功保存用户后,您希望向他发送Congrat电子邮件。因此,在UserService的createUser方法中,您将检索NotificationService并发送新的注册电子邮件。

现在对你说清楚了吗? =)

干杯,