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

## 概要
PHP歴3ヶ月、Laravel歴1ヶ月の初学者です。私が混乱した「コントローラーで処理した変数をビューへ渡す方法」や「viewやredirectの意味の違い」をまとめました。同じように頭を抱える初学者の方が一人でも減り、下記コードの赤枠部に関する悩みが少しでも解決できれば幸いです。
![show.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/6966c894-d344-d06f-0386-e8934454ab27.png)

## 開発環境
PHP 7.2.34 / Laravel 6.20.5

## コントローラーからビューへ値を渡す方法
* ①withメソッド 
* ②view関数の第二引数に［ ］
* ③view関数の第二引数にcompact関数

### ①withメソッド
記述方法：`view('ビューファイル名')->with(変数名, 引数);`
#### 渡す変数が１つの場合

```Controller.php
 //渡す変数が１つの場合
 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
 //渡す変数が１つの場合
 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
//渡す変数が１つの場合
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/e07433c9-fcc2-044c-3512-2460148c4cb9.png)
勿論、コントローラーから変数messageがviewへ渡されpageが表示される。


### ②URLで`/view2`を呼び出す
次のようなエラーが発生。
![view2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/e7c68774-dd30-eb5d-1b8b-f5c8296a4688.png)

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

### ③URLで`/redirect`を呼び出す。
![view.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/969534/e07433c9-fcc2-044c-3512-2460148c4cb9.png)
redirectはweb.phpに記載されているルーティング情報が読み込まれるため、上記の例ではweb.phpの`Route::get('/view','Controller@view');`が読み込まれる。これにより変数messageをviewへ渡すことができるためpageが表示される。




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