ララベルのパイプラインパターン
PP = Pipeline Pattern
今日、私たちは、パイプラインパターンを学び、どのようにララベルでそれを使用するでしょう.PPについては深さで読むことができますHERE . PPはどんな言語でも実装することができますが、PHPLaravel 既にこのパターンを使用しているラーラベルcore .
パイプラインパターンとは
Pipeline is a design pattern specifically optimized to handle stepped changes to an object. Think of an assembly line, where each step is a pipe and by the end of the line, you have your transformed object.
PPの巨大な実装がありますが、簡単に理解するために、パイプラインのパターンとlaravelを使用してフィルタリング機能を実装しましょう.
例
Laravelでフィルタリングシステムを構築しているとしましょう.
PDPを実装する前に。
PostControl。PHP
に
index
フィルタを実行します.public function index(Request $request)
{
$query = Post::query();
if ($request->has('active')) {
$query->where('active', $request->input('active'));
}
if ($request->has('sort')) {
$query->orderBy('title', $request->input('sort'));
}
/* get filtered data */
$posts = $query->get();
return view('demo', compact('posts'));
}
この混乱を美しいフィルタパイプラインに変えましょう。
PostControl。PHP
パイプラインパターンを実装するには、少しリファクタリングを行う必要があります.
Index
以下のようになりますpublic function index(Request $request)
{
$posts = app(Pipeline::class)
->send(Post::query())
->through([
\App\Filters\Active::class,
\App\Filters\Sort::class
])
->thenReturn()
->get();
return view('demo', compact('posts'));
}
* send()
メソッドは、メソッドを処理するクエリを渡します*
through()
メソッドは、パラメータを渡すクラスとして取得します.簡単な言葉で、これはフィルタクラスのリストです*
thenReturn()
を返します.これはすべてララヴィルによって提供されています
through()
メソッド.アクティブクラス
アプリケーションの下にアクティブなクラスを作成/フィルタの名前空間.
namespace App\Filters;
use Closure;
class Active
{
public function handle($request, Closure $next)
{
if (! request()->has('active')) {
return $next($request);
}
return $next($request)->where('active', request()->input('active'));
}
}
ソートクラス
アプリケーションの下にアクティブなクラスを作成/フィルタの名前空間.
namespace App\Filters;
use Closure;
class Sort
{
public function handle($request, Closure $next)
{
if (! request()->has('sort')) {
return $next($request);
}
return $next($request)->orderBy('title', $request->input('sort'));
}
}
それです。
もし他のフィルタを追加したいなら、新しいクラスを作る必要があります
Published
このクラスはthrough()
クラス内のフィルタ論理の実装方法handle
メソッド.結論
それは2つのフィルタだけのためにパイプラインを実装するのに圧倒的に感じるかもしれません、しかし、それは多くのフィルタまたは他の複雑な実装のために非常にきれいで、有益です.
フィルタフィルタクラス
PS :基本クラスの共通コードを抽出することでフィルタクラスをきれいにできます.次の記事のフィルタークラスのリファクタリングをしたい場合は以下のコメントを参照ください.
次まで
アーマド
Reference
この問題について(ララベルのパイプラインパターン), 我々は、より多くの情報をここで見つけました https://dev.to/abrardev99/pipeline-pattern-in-laravel-278pテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol