#リダイレクトの作成
リダイレクトレスポンスは Illuminate\Http\RedirectResponse クラスのインスタンスで、ユーザーを別のURLにリダイレクトするための適切なヘッダーを含みます。RedirectResponse インスタンスを生成する方法はいくつかありますが、最も簡単なのはグローバルの redirect ヘルパーを使う方法です:
Route::get('/dashboard', function () {
return redirect('/home/dashboard');
});
送信されたフォームが無効な場合など、ユーザーを前のページにリダイレクトしたいことがあります。その場合はグローバルの back ヘルパー関数を使います。この機能はセッションを利用するため、back 関数を呼び出すルートは web ミドルウェアグループを使うか、セッションミドルウェアがすべて適用されている必要があります:
Route::post('/user/profile', function () {
// リクエストをバリデート...
return back()->withInput();
});
#名前付きルートへのリダイレクト
パラメータなしで redirect ヘルパーを呼び出すと、Illuminate\Routing\Redirector のインスタンスが返され、Redirector の任意のメソッドを呼べます。例えば、名前付きルートへの RedirectResponse を生成するには route メソッドを使います:
return redirect()->route('login');
ルートにパラメータがある場合は、route メソッドの第2引数に渡せます:
// URIが profile/{id} のルートの場合
return redirect()->route('profile', ['id' => 1]);
便利なことに、Laravel はグローバルの to_route 関数も提供しています:
return to_route('profile', ['id' => 1]);
#Eloquentモデルを使ったパラメータの自動設定
EloquentモデルからIDパラメータを設定するルートにリダイレクトする場合は、モデル自体を渡せます。IDは自動的に抽出されます:
// URIが profile/{id} のルートの場合
return redirect()->route('profile', [$user]);
ルートパラメータに設定する値をカスタマイズしたい場合は、Eloquentモデルの getRouteKey メソッドをオーバーライドしてください:
/**
* モデルのルートキーの値を取得します。
*/
public function getRouteKey(): mixed
{
return $this->slug;
}
#コントローラーアクションへのリダイレクト
コントローラーアクションへのリダイレクトも可能です。コントローラーとアクション名を action メソッドに渡します:
use App\Http\Controllers\HomeController;
return redirect()->action([HomeController::class, 'index']);
コントローラールートにパラメータが必要な場合は、action メソッドの第2引数に渡せます:
return redirect()->action(
[UserController::class, 'profile'], ['id' => 1]
);
#フラッシュセッションデータを伴うリダイレクト
新しいURLへのリダイレクトとセッションへのフラッシュデータは通常同時に行います。多くの場合、処理成功後にセッションに成功メッセージをフラッシュするためです。便利なように、RedirectResponse インスタンスを作成し、セッションにデータをフラッシュする処理を一連のメソッドチェーンで行えます:
Route::post('/user/profile', function () {
// ユーザーのプロフィールを更新...
return redirect('/dashboard')->with('status', 'Profile updated!');
});
RedirectResponse インスタンスの withInput メソッドを使うと、現在のリクエストの入力データをセッションにフラッシュしてからユーザーを新しい場所にリダイレクトできます。入力がセッションにフラッシュされた後は、次のリクエストで簡単に取得できます:
return back()->withInput();
リダイレクト後、セッションからフラッシュメッセージを表示できます。例えば、Blade構文での例:
@if (session('status'))
<div class="alert alert-success">
{{ session('status') }}
</div>
@endif