91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

laravel中使用Repository Pattern的案例

發布時間:2021-02-01 14:30:09 來源:億速云 閱讀:240 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關laravel中使用Repository Pattern的案例的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

文章正文

Repository 模式主要思想是建立在一個數據操作代理層上的,把controller里的數據操作分離出來,這樣做的好處有以下幾點:

1 把數據處理邏輯分離使得代碼更容易維護

2 數據處理邏輯和業務邏輯分離,可以對這兩個代碼分別進行測試

3 減少代碼重復

4 降低代碼出錯的幾率

5 讓controller代碼的可讀性大大提高

如圖所示Repository的分層關系

laravel中使用Repository Pattern的案例

然而,要獨立一個操作層出來,那就會增加大量代碼,非常繁瑣。如果你是小項目,未必需要使用這一模式。但如果是4-5年以上的復雜大型項目,這種模式的好處就比較明顯了。

學習Repository Pattern的意義不只是為了使用它,更會讓你深入思考框架的分層思想,你開始不僅關注怎么使用一個框架,還會想了解怎樣設計一個框架,也許會成為你往高階段編程的入口。當你感悟到什么是一種思想的時候。。。

Repository Pattern(倉庫模式)

雖然說設計模式和語言及框架無關,但是脫離了語言及框架,我們很難理解,所以我們還是在laravel的語境下來學習。

public function index(){

    $posts = Post::whereIn('category_id',[1,2])
        ->where('is_draft',0)
        ->orderBy('created_at', 'desc')
        ->take(5)
        ->get();

    return view('front.index',compact('posts'));}

以上是典型的Eloquent數據查詢代碼,如果你編程經驗豐富,你會發現這種代碼在控制器里到處都是,而且有很多是重復的,可讀性很差;我們的目標是把它精簡:

仔細觀察

Post::whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5)->get();

其實它由3部分組成.

第一是Post數據模型;

第二個是whereIn('category_id',[1,2])->where('is_draft',0)->orderBy('created_at', 'desc')->take(5),數據操作條件;

第三個是get()數據獲取的方法;

我們知道,Eloquent里有個Query Scope,可以用來把第二部分,也就是查詢條件精簡。所以,在使用了Query Scope后,我們可以把精簡成:

Post::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();

咋一看上去,好像也沒怎么精簡啊,但實際上你已經實現代碼解耦和復用了,比如說isDraft(), 這個代碼可以到處用,而不用擔心耦合問題。

精簡程度和你的邏輯抽象程度有關,比如說你完全可以寫成:

Post::findPosts([1,2],0,'desc',5)->get();

在輕型項目中,強烈推薦使用Query Scope,這是一種良好的編程習慣。

在更復雜的項目中,Query Scope就不夠用了,因為它和數據模型還是一種強耦合,Repository Pattern就是要把第一,第二,第三部分全部解耦;

說到解耦,我們在Laravel的文檔攻略中講過,第一神器就是PHP中的接口(Interface
?
下面來看例子

第一步 建立文件夾

app
Repositories
Interfaces
Implements

Interfaces里面用來放接口,Implements用來放接口的實現;

第二步  建立一個接口

在上面的Interfaces目錄新建一個文件PostInterface.php:

namespace App\Repositories\Interfaces;Interface PostInterface{   
    public function findPosts(Array $cat_id,$is_draft,$order,$take)   {

    }}

第三步  建立一個接口對應的實現

在上面的Implements目錄新建一個文件PostRepository.php:

namespace App\Repositories\Implements;use Post;class PostRepository Implements PostInterface{    
    public function findPosts(Array $cat_id,$is_draft,$order,$take){        
        $query = Post::whereIn('category_id',$cat_id)        
            ->where('is_draft',$is_draft)        
            ->orderBy('created_at', $order)        
            ->take($take)        
            ->get();        

        return $query;    
    }}

很明顯,倉庫指的就是一個倉庫接口的實現;這里定義你的業務邏輯;

第四步  在ServiceProvider中綁定接口

打開app/Providers/AppServiceProvider, 在register()加入代碼:

<?php
namespace App\Providers;use Illuminate\Support\ServiceProvider;class AppServiceProvider extends ServiceProvider{    
    public function boot(){ 

    }    

    public function register(){ 

        $this->app->bind('App\Repositories\Interfaces\PostInterface', 'App\Repositories\Implements\PostRepository');    
    }}

我們知道,ServiceProvider是Laravel IOC容器實現動態換接口實現的地方,所以我們在這里綁定一下,這樣我們在使用的時候,不直接使用接口實現,而是用ioc容器解析接口,它會幫你自動找到對應好的實現。這就意味著,以后需要更換實現,可以在這里更換;

第五步  使用倉庫

回到我們的controller里來

use App\Repositories\Interfaces\PostInterface;class PostController extends BaseController{    
    public function __construct(PostInterface $post){ 

        $this->postRepo = $post;    
    }    

    public function index(){ 

        $this->postRepo->findPosts([1,2],0,'desc',5);    
    }}

感謝各位的閱讀!關于“laravel中使用Repository Pattern的案例”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

景谷| 峡江县| 江阴市| 林周县| 舒城县| 阜新市| 广宗县| 东乌| 阳江市| 遂平县| 武邑县| 屏东县| 韶山市| 望都县| 荥阳市| 克拉玛依市| 广宁县| 赞皇县| 苏州市| 西峡县| 道孚县| 新闻| 清镇市| 苗栗市| 霍邱县| 浠水县| 大埔县| 乾安县| 九龙坡区| 泽库县| 丘北县| 高邑县| 河西区| 壶关县| 永定县| 寻甸| 黔江区| 钟祥市| 金秀| 诸暨市| 麻城市|