ララベルのパイプラインパターン


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 :基本クラスの共通コードを抽出することでフィルタクラスをきれいにできます.次の記事のフィルタークラスのリファクタリングをしたい場合は以下のコメントを参照ください.
次まで
アーマド