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

Éri*_*icP 7 model data-modeling doctrine-orm

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

据我所理解:

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

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

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

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

我有点迷失在这里.

你有什么具体的例子吗?

Gui*_*nco 17

代理是对某事的引用.

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

$group = $em->getRepository('Group')->findOneById(1);
Run Code Online (Sandbox Code Playgroud)

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

$group = $em->getReference('Group', 1);
Run Code Online (Sandbox Code Playgroud)

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

存储库是一种数据操作的东西.您可以使用它来管理您的实体.因此,您可以找到BYId,findOneByEmail等.您还可以扩展其基本功能并实现管理实体的自己的方法,例如:saveUser,retrieveMostActiveUsers.

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

你现在明白了吗?=)

干杯,

  • NotificationService为+1.真正有助于了解服务(如UserService)可以对协作服务(如NotificationService)执行何种操作.谢谢.;-) (3认同)