【问题标题】:What is the difference between proxies, repositories and services in Doctrine 2?Doctrine 2 中的代理、存储库和服务有什么区别?
【发布时间】:2011-07-09 18:56:09
【问题描述】:

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

据我所知:

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

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

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

顺便说一句,我的实体应该只包含其属性的公共 getter/setter 吗?对吗?

我有点迷路了。

你有什么具体的例子吗?

【问题讨论】:

    标签: model doctrine-orm data-modeling


    【解决方案1】:

    代理是对某物的引用。

    假设您正在创建一个用户,并且一个用户附加了一个组。 如果您没有代理支持,则需要在 DB 上为 Group 进行 fetch 才能使用实体。这是一个可能的代码:

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

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

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

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

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

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

    你现在清楚了吗? =)

    干杯,

    【讨论】:

    • 通知服务+1。确实有助于理解服务(如 UserService)可以与协作服务(如 NotificationService)一起做什么样的事情。谢谢。 ;-)
    猜你喜欢
    • 2011-08-15
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-14
    • 2015-09-15
    • 2017-08-20
    • 1970-01-01
    • 2018-02-16
    相关资源
    最近更新 更多