特定のページからログインページに遷移してログインした時に、元のページ(ログインページに遷移する前のページ) にリダイレクトさせる方法を書いていきたいと思います。
直前のページに戻る方法
まず、ログイン後に直前のページに戻る方法ですが、それは下記の記事が参考になります。
【Laravel】ログインした後、固定ページに飛ばさずにログインボタンを押した画面に戻りたい。 - Qiita
こちらの記事では$_SERVER['HTTP_REFERER']
を使って直前のURLを取得していますが、laravelで用意されているurl()->previous()
を使って直前のURLを取得することも可能です。
LoginController.php
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
// 直前ページのURLを取得
$prevUrl = url()->previous();
session(['url.intended' => $prevUrl]);
return view('auth.login');
}
特定のページのみリダイレクト先を指定する
直前のページへのリダイレクト方法を元に、特定のページからログインページに遷移してきた場合のみリダイレクト先を指定する方法を書いていきます。
やることは簡単で、該当するページのルート名を格納する配列を作って、直前のページのルート名がその配列の中に含まれている場合のみセッションをセットするようにすればいいだけです。
直前のページのルート名を取得する方法
app('router')->getRoutes()->match(app('request')->create(url()->previous()))->getName();
ルーティングの設定
web.php
Route::get('hoge', [
'uses' => 'HogeController@hoge',
'as' => 'hoge'
]);
LoginController.php
// リダイレクトの対象となるルート名を定義
private const PREV_REDIRECT_ROUTE_NAMES = ['hoge'];
/**
* Show the application's login form.
*
* @return \Illuminate\Http\Response
*/
public function showLoginForm()
{
// 直前ページのURLを取得
$prevUrl = url()->previous();
// $prevUrlを元に直前ページのルート名を取得(存在しない場合は404になります)
$prevRouteName = app('router')->getRoutes()->match(app('request')->create($prevUrl))->getName();
if (in_array($prevRouteName, self::PREV_REDIRECT_ROUTE_NAMES, true)) {
// ログインページの直前ページのルート名が定数PREV_REDIRECT_ROUTE_NAMESに含まれていたらログイン後そのページにリダイレクトさせる
session(['url.intended' => $prevUrl]);
}
return view('auth.login');
}