🤩
Laravel11・Breeze ログインしたら、ログイン前のページに戻る
良く実装するコードなので備忘録.
Laravel11・Breezeを実装済みのBladeのケース。
ログイン前のURLを保存する
まず、ログインページにアクセスするその直前のURLをセッションに保存します。
AuthディレクトリのAuthenticatedSessionControllerのcreateで行います。
AuthenticatedSessionController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\URL;
public function create(Request $request)
{
if (! $request->session()->has('url.intended')) {
$request->session()->put('url.intended', URL::previous());
}
return view('auth.login');
}
但し、URL::previous()はブラウザの履歴に依存するので、ユーザーが戻るボタンを使ってログインページに入った場合はURLが取得できないこともあります。
ログイン後のリダイレクト先の変更
通常、ログイン後はdashboardにリダイレクトするように書かれています。
これをセッションに保存したURLにリダイレクトするように変更します。
AuthディレクトリのAuthenticatedSessionControllerのstoreで行います。
AuthenticatedSessionController.php
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Validation\ValidationException;
public function store(LoginRequest $request): RedirectResponse
{
$request->authenticate();
$request->session()->regenerate();
if ($request->session()->has('url.intended')) {
$intendedUrl = $request->session()->pull('url.intended');
return redirect()->intended($intendedUrl);
}
return redirect()->intended(route('dashboard', absolute: false));
}
$request->session()->has('url.intended') でセッションに保存したURLが存在すればそのURLにリダイレクトし、無ければ通常のdashboardにリダイレクトします。
セキュリティ上、必要に応じて、リダイレクト先がアプリ内のURLかどうか判定するメソッドもつけて実装してください。
一例のコードを載せておきます。
php
private function isAppUrl($url)
{
$parsedUrl = parse_url($url);
// ホストが存在して現在のアプリのホストと一致するか確認
if (isset($parsedUrl['host'])) {
return $parsedUrl['host'] === parse_url(URL::current())['host'];
}
// ホストが存在しない場合は、パスのみのURLとみなしてアプリ内と判定
return true;
}
parse_urlでURLを解析し、正誤判定を返します。
Discussion