2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2021-01-03

概要

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

開発環境

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を呼び出す

view.png
勿論、コントローラーから変数messageがviewへ渡されpageが表示される。

②URLで/view2を呼び出す

次のようなエラーが発生。
view2.png

Undefined variable: message (変数messageに値がないよ)
view2メソッドは変数messageをviewへ渡していないため、エラーが出力される。

③URLで/redirectを呼び出す。

view.png
redirectはweb.phpに記載されているルーティング情報が読み込まれるため、上記の例ではweb.phpのRoute::get('/view','Controller@view');が読み込まれる。これにより変数messageをviewへ渡すことができるためpageが表示される。

最後に

私はLaravelを初めて触った時にコントローラーの戻り値の理解にかなり苦しみました。
書籍やネット情報で調べましたが、書き方にかなり差があってごちゃごちゃになりました。。
初歩的な部分ではありますが、初学者の方の理解の助けになれればと思います。
viewやredirectに関してはもう少し深掘りして更新していきます。
(もしこの記事に誤りがありましたらご教授いただけると幸いです。)

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?