为了账号安全,请及时绑定邮箱和手机立即绑定

为什么存储库不应该返回 DTO

为什么存储库不应该返回 DTO

PHP
慕少森 2022-12-23 13:09:21
阅读了很多人们说我应该返回领域模型的文章……但这会破坏我存储库的整个想法。我正在使用 laravel Eloquent 模型(如果我是正确的话 - 域模型)。我有存储库,所以如果我决定切换到 Doctrine,我可以在服务提供商中全部交换。但是,如果我将返回一个域模型实例(在本例中为 Eloquent 模型),那将毫无意义。我需要从存储库返回相同的结果,而 DTO 似乎正是我所需要的......有人可以解释我为什么错了吗?
查看完整描述

1 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

什么是什么

首先,我想对您使用的术语进行解释。

DTO(数据传输对象)

  • 通常是具有公共属性的 PHP 类

  • 只负责承载数据

  • 不不验证数据

  • 不知道任何特定于实现的事情(例如它绑定到哪个 ORM)

  • 通常用于在应用程序的各个部分之间传递数据,而任何一部分都不知道另一部分的实现

领域模型

  • 通常是具有私有属性的 PHP 类

  • 应该只包含有效数据

  • 验证任何更改都会导致有效状态

  • 不知道任何特定于实现的事情(例如它绑定到哪个 ORM)

资料库

  • 只负责存储和检索数据

  • 知道它的实现(例如它绑定到哪个 ORM)

  • 不负责返回有效数据

这对您的情况意味着什么

答案实际上取决于您在分担责任方面的想法有多纯粹。

如果您与纯粹主义者交谈,他们会说 Eloquent 模型不是 DTO,它们也不是域模型。存储库将返回一个雄辩的模型,该模型将映射到域模型。然后可以修改该域模型或将其转换为可用于读取数据的 DTO。在这种情况下,职责以拥有更多代码为代价被分离。

如果您与实用主义者交谈,他们会说 Eloquent 模型是 DTO 和域模型(有时甚至是存储库)。由于 Eloquent 模型负责存储数据、检索数据、修改数据并将此数据传递给应用程序的其他部分。

最后,一切都与偏好有关。你可以纯粹,你可以务实,你甚至可以在两者之间做出选择。这完全取决于你是一个多么先进的编码器,项目有多大,它应该如何维护,必须进行多快的更改等。

时间差

存储库可以返回 DTO 或域模型,具体取决于您在分离职责方面的想法。


查看完整回答
反对 回复 2022-12-23
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信