亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

推薦:好用的 Laravel Repository 包

MAX_zuo / 1688人閱讀

摘要:但在中也不可避免的基礎(chǔ)模式,上述問(wèn)題仍然存在。這樣可以完全分離和的依賴。最開(kāi)始在中使用是通過(guò)定義大量的來(lái)注入,,實(shí)現(xiàn)具體的工作類。但是像鏈接調(diào)用仍然沒(méi)有解決,為些我們開(kāi)發(fā)出了新的倉(cāng)庫(kù)包。目前此包已經(jīng)使用在好幾個(gè)項(xiàng)目中目前運(yùn)行良好。

什么是Repository模式,如何使用Repository模式

這里就不再啰嗦了,請(qǐng)參見(jiàn)以下幾個(gè)鏈接
如何使用 Repository 模式?
關(guān)于 Repository 的設(shè)計(jì)模式
laravel-china.org搜索

我的使用歷程 原由

MVC在如今仍然是流行趨勢(shì),但多數(shù)框架都只提供基礎(chǔ)的MVC架構(gòu)。
幾年前在開(kāi)發(fā)中我們經(jīng)常會(huì)遇到問(wèn)題Model過(guò)于臃腫,寫著寫著就會(huì)變成類似于萬(wàn)能類,最后面的人就真成了接盤俠了。
很不幸我就是其中之一。后來(lái)我就一直在思考如何才能讓Model看起來(lái)清爽,功能更加單一簡(jiǎn)潔。(當(dāng)時(shí)并不知道Repository),終于開(kāi)始重構(gòu)。一把心酸淚。。。。。最多的是組合和Trait

使用Laravel

最開(kāi)始接觸Laravel就是感覺(jué)它的文檔清爽,以為是個(gè)簡(jiǎn)單的框架,結(jié)果不小心一入坑,才發(fā)現(xiàn)被它的外表給欺騙了。
但卻也為此深深愛(ài)上了它,是啊,這不就是我一直追求的嗎?無(wú)限的靈活性,可替換,越研究代碼越發(fā)現(xiàn)處處都是精髓。
但在Laravel中也不可避免的基礎(chǔ)MVC模式,上述問(wèn)題仍然存在。

初期使用

一直以為我都遵循一個(gè)核心:以倉(cāng)庫(kù)層為處理數(shù)據(jù)基礎(chǔ),為SerivceController等提供數(shù)據(jù)供給,倉(cāng)庫(kù)需要的原始數(shù)據(jù)則通過(guò)Model中獲取。這樣可以完全分離ModelController的依賴。
最開(kāi)始在Laravel中使用是通過(guò)定義大量的RepositoryInterface來(lái)注入,bind,實(shí)現(xiàn)具體的Repository工作類。
這是理想的使用方法可替換性很強(qiáng)。

遇到的問(wèn)題

實(shí)際開(kāi)發(fā)過(guò)程中Repository基本不會(huì)被替換,無(wú)數(shù)的Interface帶來(lái)的規(guī)范,也帶來(lái)了開(kāi)發(fā)的麻煩。

在使用Repository模式中我們不斷的注入Model,每個(gè)方法都需要直接Model來(lái)進(jìn)行一次次的查詢數(shù)據(jù)集,卻失去了在外層鏈?zhǔn)秸{(diào)用的便捷性(這其實(shí)并不合理,但存在即有原由)。

中間的折中

后來(lái)索性在開(kāi)發(fā)中我們?nèi)サ袅?b>Interface的約束,直接作用功能類來(lái)注入使用,此時(shí)簡(jiǎn)潔性和便捷性大大的提高,如果非要替換仍然bind可以解決問(wèn)題。這樣的開(kāi)始一直持續(xù)很長(zhǎng)時(shí)間。但是像鏈接調(diào)用仍然沒(méi)有解決,為些我們開(kāi)發(fā)出了新的倉(cāng)庫(kù)包。https://github.com/crcms/repository

再次輪回

開(kāi)始玩微服務(wù),開(kāi)始分離代碼,當(dāng)然就離不開(kāi)RPC,十分慶幸我們使用了Repository模式,通過(guò)開(kāi)啟對(duì)應(yīng)的Rpc Repository,我們可以很快進(jìn)行本地Repository切換,以Interface來(lái)約束。

便捷的Repository包 基礎(chǔ)示例
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方法

在多條件搜索中,肯定會(huì)存在大量的判斷,優(yōu)雅度太低,如:

if($request->input("username")) {
    $query->where("username",$username)
}

if($request->input("email")) {
    $query->where("email",$email)
}

.......

但通過(guò)QueryMagic方法我們可以輕松優(yōu)雅解決這些問(wèn)題,示例:

創(chuàng)建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(這里只是簡(jiǎn)單示例):

    public function paginate(array $condition, int $perPage = 15): LengthAwarePaginator
    {
        return $query->magic(new TestMagic($condition))->orderBy($this->getModel()->getKeyName(), "desc")->paginate($perPage);
    }
更多

開(kāi)發(fā)此包的原因是在這之前我并示找到我想要的(適合我的)兼具Model的靈活性以及數(shù)據(jù)倉(cāng)庫(kù)的分離模式,所以為此開(kāi)發(fā)了這個(gè)倉(cāng)庫(kù)包。目前此包已經(jīng)使用在好幾個(gè)項(xiàng)目中目前運(yùn)行良好。
后面還打算兼容TP以及Yii等使用率高的框架,暫時(shí)只支持Laravel
更多詳情,請(qǐng)移步github:https://github.com/crcms/repository

最后

哈哈,請(qǐng)?jiān)徫抑钡奈谋久枋?,希望?duì)需要的人以及面臨和我曾經(jīng)一樣困惑的人有所幫助。
原文出處:crcms-blog

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/29014.html

相關(guān)文章

  • [開(kāi)源] LaravelPlus - 基于 Laravel 魔改,為方便實(shí)際業(yè)務(wù)使用 - 開(kāi)發(fā)中

    摘要:目的為了減少重復(fù)和新項(xiàng)目的配置麻煩等問(wèn)題,就是為了騙星星如現(xiàn)有的生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。有些本地,測(cè)試,線上的配置需要頻繁改動(dòng)的需要。 目的 為了減少重復(fù) CURD 和新項(xiàng)目的配置麻煩等問(wèn)題,(就是為了騙星星:LaravelPlus )如: 現(xiàn)有的 infyomlabs/laravel-generator CODE 生成工具雖然好用,但是不太喜歡樣式和代碼結(jié)構(gòu)。...

    weknow619 評(píng)論0 收藏0
  • Laravel學(xué)習(xí)筆記之bootstrap源碼解析

    摘要:總結(jié)本文主要學(xué)習(xí)了啟動(dòng)時(shí)做的七步準(zhǔn)備工作環(huán)境檢測(cè)配置加載日志配置異常處理注冊(cè)注冊(cè)啟動(dòng)。 說(shuō)明:Laravel在把Request通過(guò)管道Pipeline送入中間件Middleware和路由Router之前,還做了程序的啟動(dòng)Bootstrap工作,本文主要學(xué)習(xí)相關(guān)源碼,看看Laravel啟動(dòng)程序做了哪些具體工作,并將個(gè)人的研究心得分享出來(lái),希望對(duì)別人有所幫助。Laravel在入口index...

    xiaoxiaozi 評(píng)論0 收藏0
  • 使用樁件 (Stub) 解決 Laravel 單元測(cè)試中依賴

    摘要:可是我們?cè)谧鰡卧獪y(cè)試的時(shí)候,希望盡可能少的產(chǎn)生依賴。后記任何一個(gè)可靠的系統(tǒng),單元測(cè)試都是必不可少的。慶幸的是,幫我們提供了好用的單元測(cè)試。 本文是我在實(shí)踐后的一點(diǎn)總結(jié),難免有不妥之處。如有幸得大神路過(guò),還望不吝賜教,小弟在此謝過(guò)了! 很早就知道有單元測(cè)試的概念,也曾嘗試過(guò),但是一直對(duì)單元測(cè)試的概念和方法,比較模糊。在聽(tīng)了 @vimac 大神的講堂 PHP單元測(cè)試與測(cè)試驅(qū)動(dòng)開(kāi)發(fā) 后,慢慢...

    Miyang 評(píng)論0 收藏0
  • Laravel不權(quán)威導(dǎo)航

    摘要:版微信第三方登陸包括微信微博等等,查看支持列表擴(kuò)展好用的圖片處理,也方便使用百度版百度版支付集合,包含支付寶等支付寶在的封裝各國(guó)語(yǔ)言包,包含簡(jiǎn)體中文生成二維碼工具,親測(cè)好用未完大家可以向我推薦,直接在本文下留言即可。 Laravel不權(quán)威導(dǎo)航 Hi 這里是Roy整理的Laravel相關(guān)索引,希望能幫到大家showImg(http://static.segmentfault.com/bu...

    focusj 評(píng)論0 收藏0
  • 下載量最高 100 個(gè) Laravel 擴(kuò)展推薦

    摘要:本文經(jīng)授權(quán)轉(zhuǎn)自社區(qū),后續(xù)更新將以帖子內(nèi)容和內(nèi)容為準(zhǔn)。說(shuō)明另一個(gè)令人喜歡的地方,是擁有活躍的開(kāi)發(fā)者社區(qū),而活躍的開(kāi)發(fā)者社區(qū)帶來(lái)的,是繁華的擴(kuò)展包生態(tài)。本文對(duì)上打了標(biāo)簽的擴(kuò)展包進(jìn)行整理,截止到現(xiàn)在年月號(hào),有超過(guò)個(gè)擴(kuò)展包,以下是下載量最大的個(gè)。 本文經(jīng)授權(quán)轉(zhuǎn)自 PHPHub 社區(qū),后續(xù)更新將以 PHPHub 帖子內(nèi)容 和 GitHub 內(nèi)容 為準(zhǔn)。 說(shuō)明 Laravel 另一個(gè)令人喜歡的地方...

    Tychio 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<