[Laravel] コントローラー→ビューの値渡し・view, redirect


概要

PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。私が混乱した「コントローラーで処理した変数をビューへ渡す方法」や「viewやredirectの意味の違い」をまとめました。同じように頭を抱える初学者の方が一人でも減り、下記コードの赤枠部に関する悩みが少しでも解決できれば幸いです。

開発環境

PHP 7.2.34 / Laravel 6.20.5

コントローラーからビューへ値を渡す方法

①withメソッド
②view関数の第二引数に[ ]
③view関数の第二引数にcompact関数

①withメソッド

記述方法:view('ビューファイル名')->with(変数名, 引数);

渡す変数が1つの場合

Controller.php
 //渡す変数が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('ビューファイル名', ['変数名' , 引数 ]);

Controller.php
 //渡す変数が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('変数名'));

Controller.php
 //渡す変数が1つの場合
 public function CompactPattern(){
  $message = "Hello";
 return view('test',compact('message'));

 //渡す変数が複数の場合 (変数名をカンマで区切って記述。)
 public function CompactPattern2(){
  $message = "Hello";
  $name = "John";
 return view('test',compact('message','name'));
 }

ビューは{{変数名}}で①②③全て展開可能(変数が複数でも同様)

view.php
 <p>
     日本語のこんにちは,英語では{{$message}}です // Hello
 </p>

比較すると、変数名のみで記述ができるcompact関数で値を渡すこと方が可読性が良さそうです。特に変数が増えてきたときに顕著ですね。(これは私の考察です。)

参考:https://laraweb.net/knowledge/1345/

view()とredirect()の違い

viewとredirectの挙動について実際に検証しました。様々なQiita記事を見ましたが、「これ本当?」と思われるものがあったので…

view()はresouces->viewファイルを読みにいき、
redirect()はweb.phpのルーティング情報を読みにいくことが大きな違いのようです。
下記の処理をそれぞれ呼び出していきます。

Controller.php
public function view()
 {   
    $message = "viewの表示";
    return view('/page',compact("message"));
 }
public function view2()
 {   
    return view('/page');
 }
public function redirect()
 {   
    return redirect('/view');
 }
web.php
Route::get('/view','Controller@view');
Route::get('/view2','Controller@view2');
Route::get('/redirect','Controller@redirect');
page.blade.php
<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に関してはもう少し深掘りして更新していきます。
(もしこの記事に誤りがありましたらご教授いただけると幸いです。)