[Laravel] redirect()とview()の違いについて

##はじめに

この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、view()とredirect()の違いについて学んだことをまとめておきたいと思います。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

##view()とredirect()の違いとは
前提として、view()とredirect()は両者共に、ページ遷移をさせる処理です。

両者の違いとしては、
``view()の特徴``
Controllerでview()を使い、直接view(bladeファイル)を指定して、ブラウザで表示します。

``redirect()の特徴``
Controllerでredirect()を使い、遷移先ページへのRouteを指定して、指定したURLへリダイレクトさせ、そのルーティングに沿ったview(bladeファイル)を表示します。



下記にてview()とredirect()について、それぞれ少し掘り下げてまとめておきたいと思います。



##view()とは
viewヘルパの第一引数に、``resources/viewsディレクトリ``中のビューファイル名を入れることで遷移先ページとして指定することができます。

resources/viewsディレクトリがネストしている場合、ドット記法を利用してディレクトリ名とファイル名を繋げることで、ネストに対応することができます。

``例``

```php
//resources/views/sample.blade.phpを指定する場合
return view('sample', ['xxx' => 'xxxx']);

//resources/views/test/sample.blade.phpを指定する場合(ネスト)
return view('test.sample', compact('xxx'));
```

``補足``
view()では、データを配列形式でビューに渡すことが可能です。

``例``

```php
//キー／値ペアの配列でデータを渡す
return view('sample', ['xxx' => 'xxxx']);

//モデルのインスタンスを配列として渡す
return view('sample', compact('model'));
```


##redirect()とは
>
redirect関数は、リダイレクトHTTPレスポンスを返します。引数無しで呼び出した場合は、リダイレクタインスタンスを返します。
``引用:``[Lravel 6.x ヘルパ redirect()](https://readouble.com/laravel/6.x/ja/helpers.html?header=redirect())

**``リダイレクトHTTPレスポンスとは``**
リダイレクトのレスポンスは**Illuminate\Http\RedirectResponseクラスのインスタンス**であり、ユーザーを他のURLへリダイレクトさせるために必要なしっかりとしたヘッダを含んでいます。

要するに、RedirectResponseクラスのインスタンスを生成する方法の１つとして、redirect()が存在しています。

``使用例1:``redirect()の引数に直接ルートを記述

```php
Route::get('sample', function () {
    return redirect('home/sample');
});
```

``使用例2:``名前付きルートへのリダイレクト
>
redirectヘルパを引数無しで呼ぶと、Illuminate\Routing\Redirectorインスタンスが返され、Redirectorインスタンスのメソッドが呼び出せるようになります。たとえば、名前付きルートに対するRedirectResponseを生成したい場合は、routeメソッドが使えます。
``引用:``[Laravel 6.x HTTPレスポンス リダイレクト ](https://readouble.com/laravel/6.x/ja/responses.html#redirects)

```php
//routeメソッドを使い名前付きルートを指定する
return redirect()->route('login');

//ルートにパラメーターがある場合は、routeメソッドの第２引数として渡す
return redirect()->route('users.show', ['name' => $user->name]);
```

``使用例3:``Eloquentモデルによる、パラメータの埋め込み

モデルをそのまま渡すことで、Eloquentモデルの**ID**をルートパラメーターとしてリダイレクトすることができます。

```php
public function show(Article $article){

return redirect()->route('articles.show', [$article]);
//or
return redirect()->route('articles.show', compact('article'));

}
```
``使用例4:``コントローラアクションへのリダイレクト
>
コントローラアクションに対するリダイレクトを生成することもできます。そのためには、コントローラとアクションの名前をactionメソッドに渡してください。LaravelのRouteServiceProviderにより、ベースのコントローラ名前空間が自動的に設定されるため、コントローラの完全名前空間名を指定する必要がないことを覚えておいてください。
``引用:``[Laravel 6.x HTTPレスポンス リダイレクト](https://readouble.com/laravel/6.x/ja/responses.html#redirects)

```php
return redirect()->action('HomeController@index');

//コントローラルートにパラメーターが必要ならば、actionメソッドの第２引数として渡す
return redirect()->action('UserController@profile', ['id' => 1]);
```

``使用例5:``フラッシュデータを保存するリダイレクト
>
新しいURLへリダイレクトし、セッションへフラッシュデータを保存するのは、一度にまとめて行われる典型的な作業です。典型的な使い方は、あるアクションが実行成功した後に、実効成功メッセージをフラッシュデータとしてセッションに保存する場合でしょう。これに便利なように、RedirectResponseインスタンスを生成し、メソッドチェーンを一つだけさっと書けば、データをセッションへ保存できるようになっています。
``引用:``[Laravel 6.x HTTPレスポンス リダイレクト](https://readouble.com/laravel/6.x/ja/responses.html#redirects)

```php
//with()を使うことでフラッシュメッセージを利用できる(フラッシュメッセージ詳細設定後)
return redirect()->route('login')->with('msg_success', 'ログインしました');
```


##参考文献

[Laravel 6.x HTTPレスポンス ](https://readouble.com/laravel/6.x/ja/responses.html)

[Laravel 6.x ビュー](https://readouble.com/laravel/6.x/ja/views.html)