站長資訊網
        最全最豐富的資訊網站

        淺析Laravel中存儲庫模式(Repository)的優點

        為什么要在 Laravel 中使用存儲庫模式(Repository)?下面本篇文章給大家介紹一下使用存儲庫模式的優點,希望對大家有所幫助!

        淺析Laravel中存儲庫模式(Repository)的優點

        Laravel 9 保姆級視頻教程,想學不會都難!進入學習

        • 1. Laravel中的存儲庫模式
        • 2. 為什么要在 Laravel 中使用存儲庫模式(Repository)?

        在之前的文章中,我解釋了什么是存儲庫模式,它與Active Record模式有何不同,以及如何在Laravel中實現它。現在我想深入了解一下為什么應該使用存儲庫模式。

        我在上一篇文章的評論中注意到,Repository模式在Laravel社區中是一個有爭議的話題。有些人認為沒有理由使用它,并堅持使用內置的Active Record模式。其他人則傾向于使用其他方法將數據訪問從邏輯域中分離出來。請注意,我尊重這些意見,并將在接下來的博客文章中專門討論此主題。

        有了這個免責聲明,讓我們來了解一下使用存儲庫模式的優點。

        單一責任原則

        單一責任原則是主要鑒別器來區分Active Record模式和存儲庫模式。模型類已經保存數據并提供域對象的方法。當使用Active Record模式時,數據訪問是額外引入的責任。這是我想在以下示例中說明的東西:

        /**  * @property string $first_name  * @property int    $company_id  */ class Employee extends Model {}  $jack = new Employee(); $jack->first_name = 'Jack'; $jack->company_id = $twitterId; $jack->save();
        登錄后復制

        雖然域模型和數據訪問技術的職責混合,但它直觀上看還說得過去。在我們的應用程序中,員工必須以某種方式存儲在數據庫中,因此為什么不調用對象上的save()。單個對象被轉化成單個數據行并存儲。

        但是,讓我們更進一步,看看我們還能對員工做些什么:

        $jack->where('first_name', 'John')->firstOrFail()->delete(); $competition = $jack->where('company_id', $facebookId)->get();
        登錄后復制

        現在,它變得不直觀,甚至違背了我們的域模型。 為什么 Jack 會突然刪除另一個甚至可能在不同公司工作的員工? 或者他為什么能把 Facebook 的員工拉過來?

        當然,這個例子是人為設計的,但它仍然顯示了 Active Record 模式如何不允許有意的域模型。 員工與所有員工列表之間的界限變得模糊。 您始終必須考慮該員工是被用作實際員工還是作為訪問其他員工的機制。

        倉庫模式通過強制執行這個基本分區來解決這個問題。它的唯一用途是標識域對象的合集,而不是域對象的本身。

        要點:

        • 通過將所有域對象的集合與單個域對象分離, 倉庫模式體現了單一責任原則

        不要重復自己 (DRY)

        一些項目將數據庫查詢灑遍了整個項目。下面是一個例子,我們從數據庫中獲取列表,并在 Blade 視圖中顯示他們。

        class InvoiceController {      public function index(): View {         return view('invoices.index', [             'invoices' => Invoice::where('overdue_since', '>=', Carbon::now())                 ->orderBy('overdue_since')                 ->paginate()         ]);     } }
        登錄后復制

        當這樣的查詢遍得更加復雜并且在多個地方使用時,考慮將其提取到 Repository 方法中。

        存儲庫模式通過將重復查詢打包到表達方法中來幫助減少重復查詢。如果必須調整查詢,只需更改一次即可。

        class InvoiceController {      public __construct(private InvoiceRepository $repo) {}      public function index(): View {         return view('invoices.index', [             'invoices' => $repo->paginateOverdueInvoices()         ]);     } }
        登錄后復制

        現在查詢只實現一次,可以單獨測試并在其他地方使用。此外,單一責任原則再次發揮作用,因為控制器不負責獲取數據,而只負責處理HTTP請求和返回響應。

        Takeaway:

        • ? 存儲庫模式有助于減少重復查詢

        依賴反轉

        解釋 Dependency Inversion Principle 值得發表自己的博客文章。我只是想說明存儲庫可以啟用依賴項反轉。

        在對組件進行分層時,通常較高級別的組件依賴于較低級別的組件。 例如,控制器將依賴模型類從數據庫中獲取數據:

        class InvoiceController {     public function index(int $companyId): View {         return view(             'invoices.index',             ['invoices' => Invoice::where('company_id', $companyId)->get()]         );     } }
        登錄后復制

        依賴關系是自上而下的,緊密耦合的。 InvoiceController 取決于具體的 Invoice 類。 很難將這兩個類解耦,例如單獨測試它們或替換存儲機制。 通過引入 Repository 接口,我們可以實現依賴倒置:

        interface InvoiceRepository {     public function findByCompanyId($companyId): Collection; }  class InvoiceController {     public function __construct(private InvoiceRepository $repo) {}      public function index(int $companyId): View {         return view(             'invoices.index',             ['invoices' => $this->repo->findByCompanyId($companyId)]         );     } }  class EloquentInvoiceRepository implements InvoiceRepository {     public function findByCompanyId($companyId): Collection {         // 使用 Eloquent 查詢構造器實現該方法     } }
        登錄后復制

        Controller 現在只依賴于 Repository 接口, 和 Repository 實現一樣. 這兩個類現在只依賴于一個抽象, 從而減少耦合. 正如我將在下一節中解釋的那樣,這會帶來

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 国产精品天天看天天狠| 996久久国产精品线观看| 久久精品无码专区免费青青| 国产99久久久国产精品~~牛| 久久99国产综合精品免费| 久久久久久亚洲精品不卡| 午夜精品视频在线观看| 国产在线精品无码二区| 亚洲国产精品无码久久青草| 国产精品99无码一区二区| 国内精品免费在线观看| 久久发布国产伦子伦精品| 亚洲综合精品香蕉久久网| 精品视频一区二区三区| 91精品在线国产| 国产香蕉精品视频在| 精品无人码麻豆乱码1区2区 | 国产亚洲美女精品久久久久狼 | 精品国产毛片一区二区无码| 久久亚洲国产欧洲精品一| 99RE6热在线精品视频观看| 无码精品日韩中文字幕| 亚洲欧美日韩国产成人精品影院| 精品国产午夜肉伦伦影院| 国产A∨免费精品视频| 91麻豆精品一二三区在线| 色综合久久精品中文字幕首页 | 2022精品国偷自产免费观看| 国产精品三级在线| 国产精品电影在线观看| 国产在线不卡午夜精品2021| 国产精品合集一区二区三区| 国产第一福利精品导航| 精品一区二区久久| 免费91麻豆精品国产自产在线观看| 国产在线拍揄自揄视精品不卡| 久久国产精品国产自线拍免费| 日韩精品在线看| 国产精品无码久久四虎| 精品欧美一区二区三区久久久| 精品久久人人做人人爽综合|