初めに
今までLaravelを使っていた際に、何となくcompact関数を使ってControllerからViewへ変数を渡していましたが、なぜ配列として渡す必要があるのかや、arrayやwithとの違いがいまいち分からなかったので、調べてみました。
今回はその備忘録になります。
何か間違っている箇所がありましたら、ご指摘いただけますと幸いです。
使用環境
・PHP 7.3.24
・Laravel 7.30.4
・M1 Mac
viewメソッドを使った変数を送る際の仕組み
Laravelではviewメソッドを使うことで、指定したViewに変数を渡すことができます。
よくある書き方としては
public function show($id) {
$post = Post::find($id);
return view('posts.show', ['post' => $post]); //viewメソッド
}
などがあります。(よくController内で見かける書き方かと思います)
実はこのviewメソッドはvendor/laravel/framework/Foundation/helpers.phpにヘルパとして定義されているので、様々なファイル上から利用ができているんですよね。
ヘルパとは簡単に言うと、Laravelの好きなところで呼び出すことができる自分で好きな名前と処理を記述した関数のことです。
Laravelではこのviewメソッドというのが、プロジェクトを作成した際にvendor/laravel/framework/Foundation/helpers.phpに自動で定義されるようになっているので、初めから使うことができています。
では、viewメソッドがどのように定義されているか見てみましょう。
if (! function_exists('view')) {
/**
* Get the evaluated view contents for the given view.
*
* @param string|null $view
* @param \Illuminate\Contracts\Support\Arrayable|array $data
* @param array $mergeData
* @return \Illuminate\View\View|\Illuminate\Contracts\View\Factory
*/
function view($view = null, $data = [], $mergeData = [])
{
$factory = app(ViewFactory::class);
if (func_num_args() === 0) {
return $factory;
}
return $factory->make($view, $data, $mergeData);
}
}
この処理を見てもらうと分かるように、viewメソッドの第一引数にはファイルの情報である変数viewが、第二引数では送りたい変数の情報である変数dataが配列として定義されているかと思います。(第三引数は今回扱わないので、説明を割愛します)
このように定義されていることで、viewメソッドを使ってControllerからViewへ変数を渡すことができているんですね。
ただし、変数dataは配列として定義されているため、第二引数に変数を入れるときには配列にする必要があります。
そのためarrayやwith、compact関数を利用します。
では次にarray, with, compact関数を使ったそれぞれの変数の渡し方について見ていきましょう。
arrayを使った変数の渡し方
arrayを使った変数の渡し方は下記になります。
view('ファイル', ['渡す先での変数名' => $渡したい変数名]);
ここでは、連想配列として第二引数に渡したい変数を格納しています。
このときのキーは渡す先での変数名になるので、渡す先での変数名を元々の変数名とは違うものにしたいときはarrayを使うと良いでしょう。
withを使った変数の渡し方
withを使った変数の渡し方は下記になります。
view('ファイル')->with('渡す先での変数名', $渡したい変数名);
ここでは、withの第一引数に渡す先での変数名、第二引数に渡したい変数名を書くことで変数を渡すことができます。
複数の変数を渡したい時には
view('ファイル')->with([
'渡す先での変数名1' => $渡したい変数名1,
'渡す先での変数名2' => $渡したい変数名2
]);
とすることで行うことができます。
compact関数を使った変数の渡し方
compactを使った変数の渡し方は下記になります。
view('ファイル', compact('渡したい変数名'));
ここでは第二引数にcompact関数を使って渡したい変数を配列として格納しており、渡す先での変数名は元々の変数名と同じになるので、特に変数名を変えない時に用いると良いでしょう。
また、array、withと比べると記述が少なくなるため、可読性が向上します。
このような理由からcompact関数を使った変数の渡し方がよく用いられています。
ただしこの時、
view('ファイル', compact($渡したい変数名));
と書くとエラーが起こるので注意してください。
複数の変数を渡したい時には
view('ファイル', compact('渡したい変数名1', '渡したい変数名2'));
とすることで行うことができます。
まとめ
LaravelにおいてControllerからViewへ変数を渡す時に変数名を変えたい場合は、arrayかwithを使った書き方で、それ以外の場合は基本的にはcompact関数を使うと良いでしょう。