ホームページ >PHPフレームワーク >Laravel >laravelでのリポジトリパターンの使用(ウェアハウスモード)

laravelでのリポジトリパターンの使用(ウェアハウスモード)

藏色散人
藏色散人転載
2021-02-01 11:04:012940ブラウズ

次のチュートリアルコラムでは、laravel でリポジトリパターン (ウェアハウスモード) を使用する方法を紹介します。 記事本文

##リポジトリ モデルの主なアイデアは、データ操作を分離するデータ操作プロキシ レイヤー上に構築することです。 1 データ処理ロジックを分離するとコードの保守が容易になります 2 データ処理ロジックとビジネス ロジックを分離すると、コントローラーをテストできるようになります2 つのコードを別々に

3 コードの重複を減らす

4 コード エラーの可能性を減らす

5 コントローラー コードの可読性を大幅に向上させる

図に示すように、リポジトリの階層関係を表示します。

ただし、独立した操作層が必要な場合は、多くのコードが追加されます。とても面倒です。小規模なプロジェクトの場合は、このモードを使用する必要がない場合があります。ただし、4 ~ 5 年以上続く複雑で大規模なプロジェクトの場合、このモデルの利点はより明らかです。

リポジトリ パターンを学ぶ意義は、単に使用するだけではなく、フレームワークの階層的な考え方について深く考えるようになることです。フレームワークの設計方法も知りたい方は、もしかしたら高度なプログラミングへの入り口になれるかもしれません。思考とは何かを理解したとき。 。 。

laravelでのリポジトリパターンの使用(ウェアハウスモード)

リポジトリ パターン

デザイン パターンは言語やフレームワークとは関係ありませんが、言語やフレームワークから分離されています。私たちにとっては理解するのが難しいため、依然として 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

データです。モデル;

2 つ目は

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

, データ操作条件; 3 つ目は

get()

データ取得方法; わかっています、

Eloquent

には Query Scope があり、クエリ条件である 2 番目の部分を簡素化するために使用できます。したがって、

Query Scope

を使用した後は、次のように簡素化できます。 <pre class="brush:php;toolbar:false">Post::ofCategory([1,2])-&gt;isDraft()-&gt;orderBy('created_at', 'desc')-&gt;take(5)-&gt;get();</pre> 一見すると、あまり合理化されていないように見えますが、実際には、コードの分離とその後の処理が完了しました。 isDraft() のように再利用すると、このコードは結合の問題を気にすることなくどこでも使用できます。 簡素化の程度は、ロジックの抽象化の程度に関連します。たとえば、次のように記述できます:

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

軽量プロジェクトでは、Query Scope を使用することを強くお勧めします。 . これはプログラミングの良い習慣です。

より複雑なプロジェクトでは、

クエリ スコープ

はまだデータ モデルと強く結合されているため、十分ではありません。リポジトリ パターン は、最初の 、2 番目の 、および3 番目の部分はすべて分離されています;

分離について言えば、Laravel のドキュメント ガイドで、最初の成果物は PHP のインターフェイス ( インターフェイス )# であると述べました。

##例を見てみましょう最初のステップは、フォルダーを作成することです

app
Repositories
Interfaces
Implements

Interfaces はインターフェースを配置するために使用され、Implements はインターフェースを配置するために使用されます。インターフェイスの実装;
2 番目のステップはインターフェイスを作成することです上記の

Interfaces

ディレクトリ

PostInterface.php

に新しいファイルを作成します。 :

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

    }}
3 番目のステップは、インターフェイスに対応する実装を作成することです

上記の 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;    
    }}
明らかに、ウェアハウスはウェアハウス インターフェイスの実装を指します。ここでビジネス ロジックを定義します。

4 番目のステップは、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 コンテナを使用してインターフェイスを解析します。これにより、対応する実装が自動的に検索されます。これは、将来実装を変更する必要がある場合は、ここで変更できることを意味します;

5 番目のステップは、ウェアハウスを使用することですコントローラーに戻ります

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でのリポジトリパターンの使用(ウェアハウスモード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。