やりたいこと
LaravelにおいてJetStreamによるログイン機能を使う際、何もしないとログイン後に固定のページ(/dashboard)に飛ばされてしまいます。
以下、私が実際に検証したログイン後に元居たページに戻る方法の実装です(他にもっと良い方法があれば教えてください)。
Laravel 7 の場合
LoginController
のshowLoginForm()
をオーバーライドすることで実現できました。
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
/*
|--------------------------------------------------------------------------
| Login Controller
|--------------------------------------------------------------------------
|
| This controller handles authenticating users for the application and
| redirecting them to your home screen. The controller uses a trait
| to conveniently provide its functionality to your applications.
|
*/
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = RouteServiceProvider::HOME;
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
// $this->redirectTo = url()->previous();
}
// ▼▼▼ 新規追加 オーバーライドする ▼▼▼
public function showLoginForm()
{
if (!session()->has('url.intended')) {
session(['url.intended' => url()->previous()]);
}
return view('auth.login');
}
// ▲▲▲ 新規追加 オーバーライドする ▲▲▲
}
参考
Laravel 8 の場合
LoginController
が作成されないため、Laravel 7 自前のコントローラを用意するみたいです。
LoginController
LoginController
を自作します。
名称は任意です。通常のコントローラと同じ扱いです。
JetStreamで用意された/login
の前に、遷移前URLをセッションに保持してからリダイレクトしています。
<?php
namespace App\Http\Controllers;
class LoginController extends Controller
{
public function index()
{
if (!session()->has('url.intended')) {
session(['url.intended' => url()->previous()]);
}
return redirect('login');
}
}
web.php
上記LoginController
にアクセスするためのルート登録します。
<?php
use App\Http\Controllers\LoginController;
use Illuminate\Support\Facades\Route;
// 中略
Route::get("/my-login", [LoginController::class, "index"])->name("myLogin");
Authenticate.php
認証先のURLを自前のログイン用URLに書き換えます。
<?php
namespace App\Http\Middleware;
use Illuminate\Auth\Middleware\Authenticate as Middleware;
class Authenticate extends Middleware
{
/**
* Get the path the user should be redirected to when they are not authenticated.
*
* @param \Illuminate\Http\Request $request
* @return string|null
*/
protected function redirectTo($request)
{
if (! $request->expectsJson()) {
// return route('login'); // 変更前
return route('myLogin'); // 変更後
}
}
}
RedirectIfAuthenticated.php
認証後のリダイレクト先を書き換えます。
redirect()->intended($path)
という方法で、上記LoginController
でセッションに保存した遷移前のURLに遷移できるようです。
<?php
namespace App\Http\Middleware;
use App\Providers\RouteServiceProvider;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class RedirectIfAuthenticated
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null ...$guards
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$guards = empty($guards) ? [null] : $guards;
foreach ($guards as $guard) {
if (Auth::guard($guard)->check()) {
// return redirect(RouteServiceProvider::HOME); // ←変更前
return redirect()->intended(RouteServiceProvider::HOME); // ←変更後
}
}
return $next($request);
}
}
その他ログイン先のリンク変更
例えば、resources/views/navigation-menu.blade.phpなどで定義されているルート名を書き換えます。
href="{{ route('login') }}
→ href="{{ route('myLogin') }}
参考