Laravelでリダイレクトする方法や実装パターン6つ書いてみた

Laravel

この記事ではLaravelのリダイレクトについて、リダイレクトの方法と実装パターンについて見ていきます。
Laravelのバージョン6で挙動を確認しています。

Laravelでリダイレクトするには?

routes/web.phpは、下記のように書いているとします。

Route::get('/redirect/test', 'TestController@redirectTest');

こうするとhttp|https://ドメイン/redirect/testにアクセスされた時にTestControllerredirectTestが動いてリダイレクトされます。

アクセスされるコントローラーのメソッドに下記のように記載します。
下記はアクセスされると、googleにリダイレクトする処理になります。

public function redirectTest(){
    return redirect("https://google.com"); 
}

redirectヘルパーについて

リダイレクトする時には、リダイレクトヘルパーを使います。
基本的には上記のように、リダイレクトしたいURLを渡すとリダイレクトしてくれます。

リダイレクトのヘルパーを見てみると、引数は下記のようになっています。

function redirect($to = null, $status = 302, $headers = [], $secure = null)
{
    if (is_null($to)) {
        return app('redirect');
    }

    return app('redirect')->to($to, $status, $headers, $secure);
}

第1引数にリダイレクト先、第2引数にステータス…といった感じで渡すことができます。

app(‘redirect’)でIlluminate\Routing\Redirectorが返ってきます。
(RoutingServiceProviderクラスの中で、singletonメソッドを使ってサービスコンテナに登録されています。)

なので、実装はIlluminate\Routing\Redirectorに書いてあります。

実際にredirectヘルパーを使う時には、渡す引数と挙動のみ分かっていれば問題ないかと思います。
次に引数を見てみましょう。

引数について

第1引数はリダイレクト先のURLです。

redirect/testのように内部の相対的なパスを渡すと
http|https+サービスドメイン+redirect/testのように内部のURLにリダイレクトします。

https://google.comhttps://yahoo.co.jpなど外部サーバーを指定すると、外部にリダイレクトしてくれます。

第2引数はHTTPステータスです。
指定しない場合は、302のステータスでリダイレクトされますが、指定した場合はステータスコードを変えてくれます。
30x系のステータスを使用します。

リダイレクト時のステータスについては下記になります。

第3引数はHTTPヘッダーです。
ヘッダーに追加情報をつけることができます。

redirect("redirect/test", 301, ["TestHeader" => "hogefuga"]);

第4引数はhttps(ssl)を使うかの指定です。
trueを指定するとhttpsから始まるURLにリダイレクトされます。

よく使うredirectパターン

よく使ってる気がするrediretの書き方の実例を6つあげています。

routeヘルパーを使う

routeヘルパーを使って、指定URLにリダイレクトさせます。
routeヘルパーを使う場合は、routes/web.phpのルーティングでルートに名前を付けて、その名前を指定します。

return redirect(route('redirect1'));

Rediretorのrouteメソッドを使う

redirectはURLが空だと、自分のインスタンス(Redirector)を返してくれるので、インスタンスのrouteメソッドを使う方法もあります。

こちらもroutes/web.phpのルーティングで付けた名前を指定します。
下記の方が見やすい気がするので、個人的には好きです。結果は上記と同じです。

return redirect()->route('redirect_to');

リダイレクトする時にセッション情報を付加する

RedirectResponseクラスのwithメソッドを使うと、セッションに値を入れることができます。

return redirect()->route("redirect_to")->with(['message' => 'なんらかのメッセージとか']);

複数渡すときは、連想配列のキーと値を追加していきます。

return redirect()
        ->route("redirect_to")
        ->with([
            'message1' => 'なんらかのメッセージ1',
            'message2' => 'なんらかのメッセージ2',
        ]);

取り出すときは、sessionヘルパーやファサードを使います。
sessionヘルパーについて、詳しくはこちらに書いています。

リダイレクトする時にエラー情報を付加する

withErrorsを使うと、エラーメッセージを付加できます。
下記のようにValidatorを使って、バリデーションした時などに使います。

$validate = Validator::make($request->all(), [
            'user_name' => 'required'
        ]);

return redirect()->route("redirect_to")->withErrors($validate->errors());

こうすると、セッションのerrorsというキーに値(Illuminate\Support\ViewErrorBag)が入ります。
よくやるのがbladeビューで表示する場合は、下記のようにエラーを表示できます。

@if ($errors->any())
    <div class="alert alert-danger">
        <ul>
            @foreach ($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif

リダイレクト時に入力値を保持したい

画面からPOSTされた値や、クエリパラメータの値など、入力値を保持したい場合は、withInputメソッドを使います。

return redirect()->route("redirect_to")->withInput();

oldヘルパーを使って取得することができます。
old('user_name')のように、ビューやコントローラーで取得できます。

リダイレクトする時にURLにクエリパラメータを入れたい

リダイレクトする時にクエリパラメータを入れたい場合は、routeメソッドに第2引数につけると実現できます。

return redirect()->route('redirect_to', ['user_name' => 'taro', 'age' => 30]);

こうすると、URLに?user_name=taro&age=30のようにパラメータが付加されます。

コメント

タイトルとURLをコピーしました