Livewire Tapについて

ショコラ
ショコラ

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();

以上

Scroll to Top