php - 我们应该在存储库模式中保存/更新模型吗?
问题描述
我正在学习存储库模式,并且我已经看到了很多使用存储库模式进行创建和更新的示例。这是存储库接口的一个示例。
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);
}
我想知道存储库模式的最佳实践是什么?
如果我们应该只使用存储库来检索模型,那么我们如何处理创建/更新/删除模型?
解决方案
存储库模式完全允许对象持久性。
来自 Martin Fowler 的《企业应用程序架构模式》一书(第 322 页):
存储库在域和数据映射层之间进行调解,就像内存中的域对象集合一样。客户端对象以声明方式构造查询规范,并将它们提交给 Repository 以获得满意。对象可以添加到存储库中,也可以从存储库中删除,就像它们可以从简单的对象集合中一样,存储库封装的映射代码将在幕后执行适当的操作。
摘录很清楚:由于存储库是一个集合,您应该能够随意添加和删除对象。
我唯一担心的是你的界面。您应该将其分成两个或更多,因为您可能会有以下对象:
- 不应该被删除
- 不打算更新
- 不打算插入
创建不同的接口将使您的代码符合接口隔离原则,该原则指出不应强迫任何客户端依赖它不使用的方法。
一些例子:
假设您有一个代表您所在国家/地区的类。很少看到一个国家经常添加新州、删除或更改其名称。因此,该类
State
可以实现一个只有方法all()
和的接口show()
。假设您正在编写电子商务代码。从数据库中删除一个
Customer
不是一个选项,因为他的所有数据(如购买历史、搜索等)都会丢失。所以你会做一个软删除,设置一个标志$customer->deleted = true;
。在这种情况下,该类Customer
可以实现一个接口,该接口只有方法all()
和show()
其他接口——或两个接口——用于方法insert()
和update()
。
推荐阅读
- javascript - 尽管使用了 target="_blank",但 React Markdown 链接不会在新选项卡中打开
- linux - 像 PGAdmin 这样的 Oracle Web Tool 用于 Linux 安装?
- http - Golang 大响应 JSON 输入意外结束
- nagios - Nagios 核心摘要宏的计数错误
- eclipse - Jboss 6.1 Eclipse 4.19.0 集成
- python - 如果管理员在 tempbooking django 中将 is_active 更改为“true”,则尝试将所有信息从 Tempbooking 模型解析到 Booking 模型
- javascript - Vue3 - 在路由更改后构建 API url 并获取数据
- apache-spark - 将非常大的外部数据读入 Spark DataFrame
- powershell - 在执行 Enable-psremoting 时出现存储错误
- xamarin.forms - 无法访问已释放的对象。\n对象名称: 'PrimaryToolbarItem'