概要
PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。私が混乱した「コントローラーで処理した変数をビューへ渡す方法」や「viewやredirectの意味の違い」をまとめました。同じように頭を抱える初学者の方が一人でも減り、下記コードの赤枠部に関する悩みが少しでも解決できれば幸いです。
開発環境
PHP 7.2.34 / Laravel 6.20.5
コントローラーからビューへ値を渡す方法
- ①withメソッド
- ②view関数の第二引数に[ ]
- ③view関数の第二引数にcompact関数
①withメソッド
記述方法:view('ビューファイル名')->with(変数名, 引数);
渡す変数が1つの場合
//渡す変数が1つの場合
public function withPattern()
{
$message = "Hello";
return view('test')->with('message', $message);
}
//渡す変数が複数の場合 (配列として渡すパターン)
public function withPattern2()
{
$message = "Hello";
$name = "John";
return view('test')->with([
'message'=> $message,
'name' => $name,
]);
}
②viewの第二引数に[ ]
記述方法:view('ビューファイル名', ['変数名' , 引数 ]);
//渡す変数が1つの場合
public function SecondArgumentPattern()
{
$message = "Hello";
return view('test',['message', $message]);
}
//渡す変数が複数の場合 (配列として渡すパターン)
public function SecondArgumentPattern2()
{
$message = "Hello";
$name = "John";
return view('test',[
'message' => $message,
'name' => $name,
]);
}
③view関数の第二引数にcompact関数
記述方法:view('ビューファイル名', compact('変数名'));
//渡す変数が1つの場合
public function CompactPattern(){
$message = "Hello";
return view('test', compact('message'));
}
//渡す変数が複数の場合 (変数名をカンマで区切って記述。)
public function CompactPattern2(){
$message = "Hello";
$name = "John";
return view('test', compact('message','name'));
}
ビューは{{変数名}}で①②③全て展開可能(変数が複数でも同様)
<p>
日本語のこんにちは,英語では{{$message}}です // Hello
</p>
比較すると、変数名のみで記述ができるcompact関数で値を渡すこと方が可読性が良さそうです。特に変数が増えてきたときに顕著ですね。(これは私の考察です。)
参考:https://laraweb.net/knowledge/1345/
view()とredirect()の違い
viewとredirectの挙動について実際に検証しました。様々なQiita記事を見ましたが、「これ本当?」と思われるものがあったので…
view()はresouces->viewファイルを読みにいき、
redirect()はweb.phpのルーティング情報を読みにいくことが大きな違いのようです。
下記の処理をそれぞれ呼び出していきます。
public function view()
{
$message = "viewの表示";
return view('/page', compact("message"));
}
public function view2()
{
return view('/page');
}
public function redirect()
{
return redirect('/view');
}
Route::get('/view','Controller@view');
Route::get('/view2','Controller@view2');
Route::get('/redirect','Controller@redirect');
<h1>
これは{{$message}}です。
</h1>
①URLで/view
を呼び出す
勿論、コントローラーから変数messageがviewへ渡されpageが表示される。
②URLで/view2
を呼び出す
Undefined variable: message
(変数messageに値がないよ)
view2メソッドは変数messageをviewへ渡していないため、エラーが出力される。
③URLで/redirect
を呼び出す。
redirectはweb.phpに記載されているルーティング情報が読み込まれるため、上記の例ではweb.phpのRoute::get('/view','Controller@view');
が読み込まれる。これにより変数messageをviewへ渡すことができるためpageが表示される。
最後に
私はLaravelを初めて触った時にコントローラーの戻り値の理解にかなり苦しみました。
書籍やネット情報で調べましたが、書き方にかなり差があってごちゃごちゃになりました。。
初歩的な部分ではありますが、初学者の方の理解の助けになれればと思います。
viewやredirectに関してはもう少し深掘りして更新していきます。
(もしこの記事に誤りがありましたらご教授いただけると幸いです。)