Laravelを学習中です。
ところでLaravelをやってるとwith()メソッドがやたら出てくる。
しかも何故かリファレンス見つからないのよ。探し方悪いのかな?
普通HTMLリファレンス、Javaリファレンス、JavaScriptリファレンス色々あるでしょ。クラス名、メソッド、その中身、機能、return値全部見つかるよ。でもねLaravelのwithは見つからねーんだわ。
PHPのリファレンスかな?と思ったけど無い。
けどLaravelのドキュメントにはしばしばあちこちでwithメソッドを見かける。けど、どのクラスのどのメソッドにwith()があるのかが見当たらない。
Laravelではwithメソッドは例えばこんな風に使われている
①redirectメソッドのメソッドチェーン(->)で繋げてwithメソッド
Route::post('/user/profile', function () { // … return redirect('dashboard')->with('status', 'Profile updated!'); });
②viewメソッドのメソッドチェーンで繋げてwithメソッド
return view('greeting') ->with('name', 'Victoria') ->with('occupation', 'Astronaut');
どっちもwithメソッドだけど似たような使い方だけど同じものではなさそう。
Laravelのwithメソッドは何なのか?調べてみた
あちこち調べまわったけどリファレンスが見つからない。なのでソースから全頭検査することにしました。
そしたら見つかりました。
1つ目RedirectResponseクラスのwithメソッド
1つ目。ファイルの場所:
/vendor/laravel/framework/src/illuminate/Http/RedirectResponse.php
/** * Flash a piece of data to the session. * * @param string|array $key * @param mixed $value * @return $this */ public function with($key, $value = null) { $key = is_array($key) ? $key : [$key => $value]; foreach ($key as $k => $v) { $this->session->flash($k, $v); } return $this; }
これはRedirectResponseクラスのwithメソッド。return $thisだから自分自身を返してる。
その前にセッションにフラッシュデータを入れてるように見える。
気になったのは$this->session。これはこのクラスのprotected変数$sessionを意味していると思う。
$sessionは
use Illuminate\Session\Store as SessionStore; public function setSession(SessionStore $session) { $this->session = $session; }
という記述があるのでここでインスタンスをセットしてるように見える。でもsetSessionメソッドの呼び出し元までは追えてない。
$this->session->flash($k, $v)で、Storeクラスのflashメソッドを使ってるってことか。
2つ目、Viewクラスのwithメソッド
2つ目。ファイルの場所:
/vendor/laravel/framework/src/illuminate/View/View.php
/** * Add a piece of data to the view. * * @param string|array $key * @param mixed $value * @return $this */ public function with($key, $value = null) { if (is_array($key)) { $this->data = array_merge($this->data, $key); } else { $this->data[$key] = $value; } return $this; }
これはViewクラスのwithメソッド。return $thisだからView自身を返してる。
withメソッドの中身は、data配列の$keyに$valueを入れてる。
withメソッドの返り値がやはりViewクラスだから、さらにメソッドチェーン->で繋げて->withとかも出来る様子。
と、これで2つのwithメソッドの違いが概ね明らかになった。
Laravelのヘルパ関数にもwithがあった
あと調べてる途中でヘルパ関数のwithっていうのもあることが判明。
・with関数は、指定値を返します。関数の2番目の引数としてクロージャを渡たすと、クロージャが実行され、その戻り値を返します。
$callback = function ($value) { return is_numeric($value) ? $value * 2 : 0; }; $result = with(5, $callback); // 10
もうややこしいよ。。