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

我们应该在存储库模式中保存/更新模型吗?

我们应该在存储库模式中保存/更新模型吗?

PHP
慕哥9229398 2021-11-13 15:00:47
我正在学习存储库模式,并且我看到了很多示例,其中存储库模式用于创建和更新。这是一个存储库接口的示例。interface RepositoryInterface{    public function all();    public function create(array $data);    public function update(array $data, $id);    public function delete($id);    public function show($id);}这个存储库接口负责创建/检索和更新模型。但是,经过一些更好的搜索,我发现人们应该避免将数据持久保存在存储库中,并且存储库应该充当集合并且仅用于检索数据。这是链接。这是他们在那里所说的话。存储库最重要的区别可能是它们代表实体的集合。它们不代表数据库存储或缓存或任何数量的技术问题。存储库代表集合。你如何持有这些集合只是一个实现细节。这是一个仅检索数据的存储库示例。interface BlogRepositoryInterface{    public function all();    public function getByUser(User $user);}我想知道存储库模式的最佳实践是什么?如果我们应该只使用存储库来检索模型,那么我们如何处理创建/更新/删除模型?
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

Repository 模式完全允许对象持久化。

来自 Martin Fowler 的著作Patterns of Enterprise Application Architecture (p.322):

存储库在域和数据映射层之间充当中介,就像内存中的域对象集合一样。客户端对象以声明方式构建查询规范,并将它们提交给 Repository 以获得满意。对象可以添加到 Repository 中,也可以从 Repository 中删除,就像它们可以从一个简单的对象集合中一样,Repository 封装的映射代码将在幕后执行适当的操作。

摘录很清楚:由于 Repository 是一个集合,您应该能够随意添加和删除其中的对象。

我唯一关心的是你的界面。你应该把它分成两个或更多,因为你可能会有这样的对象:

  • 不打算删除

  • 不打算更新

  • 不打算插入

创建不同的接口将使您的代码符合接口隔离原则,该原则规定任何客户端都不应被迫依赖于它不使用的方法。

一些例子:

  • 假设您有一个代表您所在国家/地区的类。很少看到一个国家频繁地添加新州、删除或更改其名称。因此,该类State可以实现一个只有方法all()和的接口show()

  • 假设您正在编写电子商务代码。Customer从数据库中删除 a不是一种选择,因为他的所有数据,如购买历史、搜索等,都会丢失。所以你会做一个软删除,设置一个标志$customer->deleted = true;。在这种情况下,类Customer可以实现只具有方法的接口all(),并show()与其它接口-两个接口-在方法insert()update()


查看完整回答
反对 回复 2021-11-13
?
拉丁的传说

TA贡献1789条经验 获得超8个赞

我想你误解了你引用的句子:

存储库最重要的区别可能是它们代表实体的集合。它们不代表数据库存储或缓存或任何数量的技术问题。存储库代表集合。你如何持有这些集合只是一个实现细节。

没有声明说您应该只使用存储库进行阅读。存储库最重要的特性是,当您使用存储库创建或更新项目时,更改可能不会立即应用于持久层。应用更改的时间取决于存储库的实现。

我的一个小提示,我们不应该create在存储库中调用方法。作为一个集合,我们向其中添加项目,而不是创建项目。我通常有一个add方法而不是create我的存储库接口中的方法。创建应该是工厂的责任。


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

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