摘要:但在中也不可避免的基礎模式,上述問題仍然存在。這樣可以完全分離和的依賴。最開始在中使用是通過定義大量的來注入,,實現具體的工作類。但是像鏈接調用仍然沒有解決,為些我們開發出了新的倉庫包。目前此包已經使用在好幾個項目中目前運行良好。
什么是Repository模式,如何使用Repository模式
這里就不再啰嗦了,請參見以下幾個鏈接
如何使用 Repository 模式?
關于 Repository 的設計模式
laravel-china.org搜索
MVC在如今仍然是流行趨勢,但多數框架都只提供基礎的MVC架構。
幾年前在開發中我們經常會遇到問題Model過于臃腫,寫著寫著就會變成類似于萬能類,最后面的人就真成了接盤俠了。
很不幸我就是其中之一。后來我就一直在思考如何才能讓Model看起來清爽,功能更加單一簡潔。(當時并不知道Repository),終于開始重構。一把心酸淚。。。。。最多的是組合和Trait
最開始接觸Laravel就是感覺它的文檔清爽,以為是個簡單的框架,結果不小心一入坑,才發現被它的外表給欺騙了。
但卻也為此深深愛上了它,是啊,這不就是我一直追求的嗎?無限的靈活性,可替換,越研究代碼越發現處處都是精髓。
但在Laravel中也不可避免的基礎MVC模式,上述問題仍然存在。
一直以為我都遵循一個核心:以倉庫層為處理數據基礎,為Serivce和Controller等提供數據供給,倉庫需要的原始數據則通過Model中獲取。這樣可以完全分離Model和Controller的依賴。
最開始在Laravel中使用是通過定義大量的RepositoryInterface來注入,bind,實現具體的Repository工作類。
這是理想的使用方法可替換性很強。
實際開發過程中Repository基本不會被替換,無數的Interface帶來的規范,也帶來了開發的麻煩。
在使用Repository模式中我們不斷的注入Model,每個方法都需要直接Model來進行一次次的查詢數據集,卻失去了在外層鏈式調用的便捷性(這其實并不合理,但存在即有原由)。
中間的折中后來索性在開發中我們去掉了Interface的約束,直接作用功能類來注入使用,此時簡潔性和便捷性大大的提高,如果非要替換仍然bind可以解決問題。這樣的開始一直持續很長時間。但是像鏈接調用仍然沒有解決,為些我們開發出了新的倉庫包。https://github.com/crcms/repository
再次輪回開始玩微服務,開始分離代碼,當然就離不開RPC,十分慶幸我們使用了Repository模式,通過開啟對應的Rpc Repository,我們可以很快進行本地Repository切換,以Interface來約束。
便捷的Repository包 基礎示例class TestRepository extends AbstractRepository { /** * @var array */ protected $guard = [ "id", "title","other" ]; /** * @return TestModel */ public function newModel(): TestModel { return app(TestModel::class); } /** * @param int $perPage * @return LengthAwarePaginator */ public function paginate(AbstractMagic $magic = null, int $perPage = 15): LengthAwarePaginator { $query = $this->where("built_in", 1); if ($magic) { $query->magic($magic); } return $query->orderBy($this->getModel()->getKeyName(), "desc")->paginate($perPage); } /** * @param int $name * @param int $title */ public function updateName(string $name, string $title) { $this->getModel()->where("name", $name)->update(["title" => $title]); } }超好用的Magic方法
在多條件搜索中,肯定會存在大量的判斷,優雅度太低,如:
if($request->input("username")) { $query->where("username",$username) } if($request->input("email")) { $query->where("email",$email) } .......
但通過QueryMagic方法我們可以輕松優雅解決這些問題,示例:
創建Magic類
use CrCmsRepositoryAbstractMagic; use CrCmsRepositoryContractsQueryRelate; class TestMagic extends AbstractMagic { /** * @param QueryRelate $queryRelate * @param int $id * @return QueryRelate */ protected function byName(QueryRelate $queryRelate, string $name) { return $queryRelate->where("name", $name); } /** * @param QueryRelate $queryRelate * @param string $title * @return QueryRelate */ protected function byTitle(QueryRelate $queryRelate, string $title) { return $queryRelate->where("title", "like", "%{$title}%"); } /** * @param QueryRelate $queryRelate * @param int $id * @return QueryRelate */ protected function byId(QueryRelate $queryRelate, int $id) { return $queryRelate->where("id", $id); } }
使用Magic(這里只是簡單示例):
public function paginate(array $condition, int $perPage = 15): LengthAwarePaginator { return $query->magic(new TestMagic($condition))->orderBy($this->getModel()->getKeyName(), "desc")->paginate($perPage); }更多
開發此包的原因是在這之前我并示找到我想要的(適合我的)兼具Model的靈活性以及數據倉庫的分離模式,所以為此開發了這個倉庫包。目前此包已經使用在好幾個項目中目前運行良好。
后面還打算兼容TP以及Yii等使用率高的框架,暫時只支持Laravel
更多詳情,請移步github:https://github.com/crcms/repository
哈哈,請原諒我著急的文本描述,希望對需要的人以及面臨和我曾經一樣困惑的人有所幫助。
原文出處:crcms-blog
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29014.html
摘要:目的為了減少重復和新項目的配置麻煩等問題,就是為了騙星星如現有的生成工具雖然好用,但是不太喜歡樣式和代碼結構。有些本地,測試,線上的配置需要頻繁改動的需要。 目的 為了減少重復 CURD 和新項目的配置麻煩等問題,(就是為了騙星星:LaravelPlus )如: 現有的 infyomlabs/laravel-generator CODE 生成工具雖然好用,但是不太喜歡樣式和代碼結構。...
摘要:總結本文主要學習了啟動時做的七步準備工作環境檢測配置加載日志配置異常處理注冊注冊啟動。 說明:Laravel在把Request通過管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動Bootstrap工作,本文主要學習相關源碼,看看Laravel啟動程序做了哪些具體工作,并將個人的研究心得分享出來,希望對別人有所幫助。Laravel在入口index...
摘要:可是我們在做單元測試的時候,希望盡可能少的產生依賴。后記任何一個可靠的系統,單元測試都是必不可少的。慶幸的是,幫我們提供了好用的單元測試。 本文是我在實踐后的一點總結,難免有不妥之處。如有幸得大神路過,還望不吝賜教,小弟在此謝過了! 很早就知道有單元測試的概念,也曾嘗試過,但是一直對單元測試的概念和方法,比較模糊。在聽了 @vimac 大神的講堂 PHP單元測試與測試驅動開發 后,慢慢...
摘要:版微信第三方登陸包括微信微博等等,查看支持列表擴展好用的圖片處理,也方便使用百度版百度版支付集合,包含支付寶等支付寶在的封裝各國語言包,包含簡體中文生成二維碼工具,親測好用未完大家可以向我推薦,直接在本文下留言即可。 Laravel不權威導航 Hi 這里是Roy整理的Laravel相關索引,希望能幫到大家showImg(http://static.segmentfault.com/bu...
摘要:本文經授權轉自社區,后續更新將以帖子內容和內容為準。說明另一個令人喜歡的地方,是擁有活躍的開發者社區,而活躍的開發者社區帶來的,是繁華的擴展包生態。本文對上打了標簽的擴展包進行整理,截止到現在年月號,有超過個擴展包,以下是下載量最大的個。 本文經授權轉自 PHPHub 社區,后續更新將以 PHPHub 帖子內容 和 GitHub 內容 為準。 說明 Laravel 另一個令人喜歡的地方...
閱讀 3542·2021-11-23 10:10
閱讀 3311·2019-08-30 14:03
閱讀 2070·2019-08-30 13:09
閱讀 3399·2019-08-29 15:29
閱讀 1545·2019-08-29 11:23
閱讀 2010·2019-08-28 18:28
閱讀 2847·2019-08-26 13:34
閱讀 2172·2019-08-26 11:32