九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、Laravelには様々な機能がたくさんありますが、リダイレクトもそのうちの1つだと思います。
普段Laravelを使っていると、ついつい忘れがちになってしまいますけどこのリダイレクト機能、過去にPHPのみで実装した場合は以下のようにヘッダー内にlocationを指定し、送信データはひとつひとつセッションに格納したりしてたことを思い出すと、ホントに便利になったな〜と実感する今日このごろです。
header('Location: http://www.example.com/'); die();
ということで、今回はLaravelのリダイレクトを実例とともにまとめてみたいと思います。
目次
基本的なリダイレクト
リダイレクトの基本形はこうなります。
return redirect('todofuken/tokyo');
こうすることで、「http://*****.com/todofuken/tokyo」へリダイレクトしてくれます。(もちろん、「http」や「https」から始まるURLを指定することもできます。)
そして、これは
return redirect()->to('todofuken/tokyo');
と書いても同じことです。
基本的にはできるだけコードは少ないほうがいいとは思いますが、可読性を高くしたい場合はこういう書き方もありなのかなと思っています。
ちなみに、このヘルパー関数には全部で4つの引数を指定することができます。それぞれ見ていきましょう。
引数1:ダイレクトURL(URI)
さきほど紹介したリダイレクト先のURLです。
引数2:HTTPステータスコード
2つ目の引数は、HTTPステータスコードを指定します。
デフォルト値は「302」です。
実際の例を見てみましょう。
return redirect('todofuken/tokyo', 301);
これを実行してブラウザで確認してみると、以下のようにステータスコードが「301」に変わっています。
引数3:HTTPヘッダー
3つ目の引数は、追加したい「HTTPヘッダー」を指定できます。
例えば、こんな形です。
return redirect('todofuken/tokyo', 301, ['test-header' => '(^o^)'] );
これを実行して、レスポンスヘッダを確認してみると以下のように追加されています。
引数4:httpsの適用
最後の引数は、リダイレクトURLに「https://」を使うかどうかを指定します。
例えば、以下のように「true」を指定した場合、
return redirect('todofuken/tokyo', 302, [], true);
リダイレクトされるURLは、「https://*****.com/todofuken/tokyo」となります。
ルート名を使ったリダイレクト
事前にルーティングに名前をつけておけば、その名前を指定してリダイレクトすることも可能です。
例えば、以下のようなルーティングがあるとします。
Route::get('home/user_list', 'HomeController@user_list')->name('home.user_list');
この場合、route()に名前を指定するだけで自動的にURLを解決してリダイレクトしてくれます。
return redirect()->route('home.user_list');
また、もし以下のようにパラメータ付きのルーティングの場合は、route()の第2引数で該当するパラメータを指定してやります。
Route::get('user/{id}', 'UserController@show')->name('user.show');
return redirect()->route('user.show', ['id' => 100]);
そして、もしモデルのインスタンスがあるなら直接パラメータとして使うこともできて、この場合は「id」の値が自動的に抽出されます。
$user = \App\User::find(1); return redirect()->route('user.show', ['id' => $user]);
※なお、詳しいルート名の付け方は、「LaravelのRoute、全6パターン実例」を参照してください。
コントローラーのアクション(メソッド名)を使ったリダイレクト
これもルート名を使ったリダイレクトと似ていますが、指定するのはコントローラーのアクション(メソッド名)です。
例を見てみましょう。
まず、以下のようなルーティングがあるとします。
Route::get('home', 'HomeController@home');
そして、対応するコントローラーは例えばこうなります。
class HomeController extends Controller { public function home() { return view('home'); }
この場合、以下のようにコントローラーのアクションを指定すると自動でURLを解決してリダイレクトしてくれます。
return redirect()->action('HomeController@home');
もし、ルーティングにパラメータが必要な場合は第2引数へ配列で指定します。
Route::get('user/{id}', 'UserController@show');
return redirect()->action('UserController@show', ['id' => 100]);
直前のページへ戻るリダイレクト
いちいちリダイレクトする場所を指定しなくても、今まで表示してたページにリダイレクトをしたい場合はback()を使うといいでしょう。
例えば、以下のような問い合わせフォームがあるとします。(テンプレートエンジンのBladeを使った例です)
<form method="POST" action="/back"> @csrf メールアドレス<br> <input type="text" name="email"><br> 問い合わせ内容<br> <textarea name="message"></textarea><br> <button type="submit">送信</button> </form>
見た目はこうなります。
このとき、送信先のコントローラーアクションが以下のようになっていた場合、自動的に元のページへ戻してくれます。
public function back() { return back(); }
また、このような場合で送信したデータと一緒に戻したい場合はwithInput()を使えば、送信されたデータが自動でセッション内に格納されます。
public function back() { return back()->withInput(); }
送信されたデータを取得したい場合は、old()を使ってください。
<form method="POST" action="back"> @csrf メールアドレス<br> <input type="text" name="email" value="{{ old('email') }}"><br> 問い合わせ内容<br> <textarea name="message">{{ old('message') }}</textarea><br> <button type="submit">送信</button> </form>
なお、もし特定の送信データだけを戻したい場合は、以下のようにRequestをonly()などで指定してwithInput()に引数として指定します。
public function back(Request $request) { return back()->withInput($request->only(['email'])); }
セッションデータとともにリダイレクト
例えば、メッセージ送信がうまくいった場合「送信が完了しました」というメッセージを表示したいとします。
この場合は、with()を使ってセッションデータを格納しつつリダイレクトすることで実現が可能です。
例を見てみましょう。
return redirect('home')->with('result', '成功です!');
こうしておくと、リダイレクトした先で以下のようにセッションデータを取得することができます。
{{ session('result') }}
ちなみに、with()には配列も使うことができて、この場合一気にデータを格納できて便利です。
return redirect('home')->with([ 'result_1' => '成功です - 1', 'result_2' => '成功です - 2', 'result_3' => '成功です - 3' ]);
なお、with()が使えるのはredirect()だけではなく、back()でも利用ができます。
return back()->with('message', '戻りました!');
おわりに
ということで、今回はLaravelのリダイレクトについてまとめてみました。
近年、Ajaxへの移行が進んでいるウェブ業界ですが、まだまだ通常のフォーム送信も需要があると思うので、地味な機能ですけどリダイレクトもぜひ活用したいところですね。
お役に立てたら嬉しいです。
ではでは〜。