亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我們應該在存儲庫模式中保存/更新模型嗎?

我們應該在存儲庫模式中保存/更新模型嗎?

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 關注
  • 127 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號