次のチュートリアルコラムでは、laravel でリポジトリパターン (ウェアハウスモード) を使用する方法を紹介します。 記事本文
##リポジトリ モデルの主なアイデアは、データ操作を分離するデータ操作プロキシ レイヤー上に構築することです。 1 データ処理ロジックを分離するとコードの保守が容易になります 2 データ処理ロジックとビジネス ロジックを分離すると、コントローラーをテストできるようになります2 つのコードを別々に
3 コードの重複を減らす
4 コード エラーの可能性を減らす
5 コントローラー コードの可読性を大幅に向上させる
図に示すように、リポジトリの階層関係を表示します。ただし、独立した操作層が必要な場合は、多くのコードが追加されます。とても面倒です。小規模なプロジェクトの場合は、このモードを使用する必要がない場合があります。ただし、4 ~ 5 年以上続く複雑で大規模なプロジェクトの場合、このモデルの利点はより明らかです。
リポジトリ パターンを学ぶ意義は、単に使用するだけではなく、フレームワークの階層的な考え方について深く考えるようになることです。フレームワークの設計方法も知りたい方は、もしかしたら高度なプログラミングへの入り口になれるかもしれません。思考とは何かを理解したとき。 。 。リポジトリ パターン
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'));}
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 つ目は
データ取得方法; わかっています、
には Query Scope
があり、クエリ条件である 2 番目の部分を簡素化するために使用できます。したがって、
を使用した後は、次のように簡素化できます。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">Post::ofCategory([1,2])->isDraft()->orderBy('created_at', 'desc')->take(5)->get();</pre><div class="contentsignin">ログイン後にコピー</div></div>
一見すると、あまり合理化されていないように見えますが、実際には、コードの分離とその後の処理が完了しました。 isDraft()
のように再利用すると、このコードは結合の問題を気にすることなくどこでも使用できます。 簡素化の程度は、ロジックの抽象化の程度に関連します。たとえば、次のように記述できます:
Post::findPosts([1,2],0,'desc',5)->get();
軽量プロジェクトでは、Query Scope を使用することを強くお勧めします。
. これはプログラミングの良い習慣です。
より複雑なプロジェクトでは、
クエリ スコープ はまだデータ モデルと強く結合されているため、十分ではありません。リポジトリ パターン
は、最初の 、2 番目の 、および3 番目の部分はすべて分離されています;
分離について言えば、Laravel
のドキュメント ガイドで、最初の成果物は PHP のインターフェイス ( インターフェイス
)# であると述べました。
##例を見てみましょう最初のステップは、フォルダーを作成することです
app Repositories 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; }}
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'); }}
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 サイトの他の関連記事を参照してください。