この記事ではLaravelのリダイレクトについて、リダイレクトの方法と実装パターンについて見ていきます。
Laravelのバージョン6で挙動を確認しています。
Laravelでリダイレクトするには?
routes/web.php
は、下記のように書いているとします。
Route::get('/redirect/test', 'TestController@redirectTest');
こうするとhttp|https://ドメイン/redirect/test
にアクセスされた時にTestController
のredirectTest
が動いてリダイレクトされます。
アクセスされるコントローラーのメソッドに下記のように記載します。
下記はアクセスされると、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.com
やhttps://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
のようにパラメータが付加されます。
コメント