ショコラ
Livewire Tapについて
Laravle のソースを読んでいると、tap関数を使っているシーンが良く出てくる。どのような仕組みになっているか調査してみます。
もっさん先輩
tap関数の書き方は↓下のようになります。
第2パラメータの「クロージャ」のパラメーターに、「クロージャに渡す引数」が渡されます。それで戻り値に「クロージャに渡す引数」が返されます。
tap({クロージャに渡す引数},{クロージャ})
もう少し具体的に書くと↓下のようになります。
tap({クロージャに渡す引数},function({クロージャに渡す引数}){
})
ソースをみたら↓下のようになっていました。たったこれだけです。
function tap($value, $callback = null)
{
if (is_null($callback)) {
return new HigherOrderTapProxy($value);
}
$callback($value);
return $value;
}
「クロージャに渡す引数」にクラスのインスタンスを渡すと、そのクラスのメソッドを呼びまくることができるというわけです。
次に、LifecycleManager.php の fromInitialRequestメソッド で使われている tap についてみてみます。
new static で LifecycleManager 自身のインスタンスを tap の 第1パラメーターに設定して、クロージャを呼び出しています。
$this ではないので、きっとコンポーネント毎に LifecyleManager の request、instance、response のプロパティが必要なのかな思いました。
public static function fromInitialRequest($name, $id)
{
return tap(new static, function ($instance) use ($name, $id) {
$instance->instance = app('livewire')->getInstance($name, $id);
$instance->request = new Request([
'fingerprint' => [
'id' => $id,
'name' => $name,
'locale' => app()->getLocale(),
'path' => Livewire::originalPath(),
'method' => Livewire::originalMethod(),
],
'updates' => [],
'serverMemo' => [],
]);
});
}
これで LivewireManager のメソッドを呼び出しているんですね。
return LifecycleManager::fromInitialRequest($name, $id)
->boot()
->initialHydrate()
->mount($params)
->renderToView()
->initialDehydrate()
->toInitialResponse();
以上