Laravelでログイン後に元のページに戻る

# やりたいこと

LaravelにおいてJetStreamによるログイン機能を使う際、何もしないとログイン後に固定のページ（/dashboard）に飛ばされてしまいます。

以下、私が実際に検証したログイン後に元居たページに戻る方法の実装です（他にもっと良い方法があれば教えてください）。


# Laravel 7 の場合

`LoginController`の`showLoginForm()`をオーバーライドすることで実現できました。

```php:app/Http/Controllers/Auth/LoginController.php
<?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');
    }
    // ▲▲▲ 新規追加 オーバーライドする ▲▲▲
}
```

## 参考
https://www.tutsmake.com/laravel-redirect-to-previous-page-after-login-example/

# Laravel 8 の場合

`LoginController`が作成されないため、Laravel 7 自前のコントローラを用意するみたいです。

## LoginController

`LoginController`を自作します。
名称は任意です。通常のコントローラと同じ扱いです。
JetStreamで用意された`/login`の前に、遷移前URLをセッションに保持してからリダイレクトしています。

```php:app/Http/Controllers/Auth/LoginController.php
<?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`にアクセスするためのルート登録します。

```routes/web.php
<?php

use App\Http\Controllers\LoginController;
use Illuminate\Support\Facades\Route;

// 中略
Route::get("/my-login", [LoginController::class, "index"])->name("myLogin");

```

## Authenticate.php

認証先のURLを自前のログイン用URLに書き換えます。

```app/Http/Middleware/Authenticate.php
<?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に遷移できるようです。

```app/Http/Middleware/RedirectIfAuthenticated.php
<?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') }}`


## 参考
https://dev.to/aibnuhibban/login-customization-in-laravel-8-2gc8