今回はLaravelのPipelineについて調べてみました。
Laravelの公式ドキュメントには以下のように記されています。
LaravelのPipelineファサードは、一連の呼び出し可能なクラス、クロージャ、またはcallableを通して与えられた入力を
「パイプ」する便利な方法を提供し、各クラスに入力を検査または修正する機会を与え、パイプライン内の次のcallableを呼び出します
簡単にざっくり説明すると「Pipelineに何らかのデータを入れてそれに対して指定したクラスの処理をさせるもの」です。
基本となるPipelineのコードは以下の通りです。
Pipeline::send(/* 処理させたいクラスに渡すデータ */)
->through(/* 処理させたいクラスの配列 */)
->then(/* 最終処理 */);
->through(/* 処理させたいクラスの配列 */)
->then(/* 最終処理 */);
処理させたいクラスに渡すデータ
処理させたい対象のデータです。
文字列やQuery、オブジェクトなどなんでも渡せます。
処理させたいクラスの配列
sendメソッドで渡されたデータを処理させたいクラスを以下のように配列形式で指定します。
Pipeline::send(/* 処理させたいクラスに渡すデータ */)
->through([
ClassA::class,
ClassB::class,
ClassC::class,
])
->then(/* 最終処理 */);
->through([
ClassA::class,
ClassB::class,
ClassC::class,
])
->then(/* 最終処理 */);
ClassA → ClassB → ClassCの順番で処理が実行されます。
最終処理
thenメソッドに実装された処理は必ず実行される処理です。
実行されるタイミングはthroughメソッドの処理が完了した後です。
実装例
class Pipeline
{
public function handle()
{
$string = "abcde";
$string = Pipeline::send($string)
->through([
SubStr::class,
AddString::class,
])
->thenReturn();
var_dump($string);
}
}
{
public function handle()
{
$string = "abcde";
$string = Pipeline::send($string)
->through([
SubStr::class,
AddString::class,
])
->thenReturn();
var_dump($string);
}
}
class SubStr
{
public function handle($string, $next)
{
$string = substr($string, 1, 4);
return $next($string);
}
}
{
public function handle($string, $next)
{
$string = substr($string, 1, 4);
return $next($string);
}
}
class AddString
{
public function handle($string, $next)
{
$string = $string . "123";
return $next($string);
}
}
{
public function handle($string, $next)
{
$string = $string . "123";
return $next($string);
}
}
このような実装をすると先にSubStrクラスで2文字目〜4文字のみ取得され、”bcde”が$stringにセットされます。
次にAddStringクラスで”bcde”の後ろに”123″が文字列結合され最終的に「bcde123」が返されます。
以上、Pipelineが何か気になり調べた結果をまとめてみました。