Laravel Auth ログイン後のリダイレクト先をデフォルトから変更する リメイク編

# 目的

- Authのログイン認証後にリダイレクトするページをデフォルトの設定から変更する方法をまとめる

# 環境

- ハードウェア環境

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.8 | Homebrewを用いてこちらの方法で導入→[Mac HomebrewでPHPをインストールする](https://qiita.com/miriwo/items/cd54077aad7e139cf518) |
| Laravel バージョン | 8.X | commposerを用いてこちらの方法で導入→[Mac Laravelの環境構築を行う](https://qiita.com/miriwo/items/adaaaeecae69d6392e08) |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでMySQLをインストールする](https://qiita.com/miriwo/items/ef6a064bc545fbea29d9) |
| Node.jsバージョン | v12.14.1 | Homwbrewを用いてこちらの方法で導入→[Mac HomebrewでNode.jsをインストールする](https://qiita.com/miriwo/items/73d1546220f1c091a7d5) |

# 情報

- 紹介する方法の動作確認はlaravel8で行ったが基本的にどのバージョンも同じ方法で実装可能であると思う。
- 紹介するコマンドは特筆しない限り、一つ前のコマンドと同じディレクトリで実行するものとする。

# 条件

- laravelアプリにAuthによる認証機能の実装がなされていること。

# 余談

- 下記のような記事をかなり前に記載している。今回もっと簡単に実装できる方法を見つけたのでまとめることとする。
    - [Laravel Authで実装したログイン機能 ログイン後のリダイレクト先を/homeから変更する](https://qiita.com/miriwo/items/104eac29bdf4d04307d7)

# 方法

1. laravelアプリ名ディレクトリで下記コマンドを実行してファイルを開く。

    ```terminal
    $ vi app/Providers/RouteServiceProvider.php
    ```

1. `public const HOME =`のようにpublicの定数を定義している部分があるのでここにログイン後にリダイレクトさせたいパスを入力する。
1. たとえはログイン後のリダイレクトで`/top`にリダイレクトするように変えたいなら下記のように記載する。

    ```アプリ名ディレクトリ/app/Providers/RouteServiceProvider.php
    <?php
    
    namespace App\Providers;
    
    use Illuminate\Cache\RateLimiting\Limit;
    use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\RateLimiter;
    use Illuminate\Support\Facades\Route;
    
    class RouteServiceProvider extends ServiceProvider
    {
        /**
         * The path to the "home" route for your application.
         *
         * This is used by Laravel authentication to redirect users after login.
         *
         * @var string
         */
        public const HOME = '/top';
    
        /**
         * The controller namespace for the application.
         *
         * When present, controller route declarations will automatically be prefixed with this namespace.
         *
         * @var string|null
         */
        // protected $namespace = 'App\\Http\\Controllers';
    
        /**
         * Define your route model bindings, pattern filters, etc.
         *
         * @return void
         */
        public function boot()
        {
            $this->configureRateLimiting();
    
            $this->routes(function () {
                Route::prefix('api')
                    ->middleware('api')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/api.php'));
    
                Route::middleware('web')
                    ->namespace($this->namespace)
                    ->group(base_path('routes/web.php'));
            });
        }
    
        /**
         * Configure the rate limiters for the application.
         *
         * @return void
         */
        protected function configureRateLimiting()
        {
            RateLimiter::for('api', function (Request $request) {
                return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
            });
        }
    }
    ```

# 簡単な解説

1. なんで`app/Providers/RouteServiceProvider.php`のHOME定数定義部分を変更することで認証後のリダイレクト先を変更できるのかを宦官に説明する。
1. 認証後のリダイレクト処理が記載されているファイルは下記である。
    - app/Http/Middleware/RedirectIfAuthenticated.php （ミドルウェアの設定としてのリダイレクトの指示）
    - app/Http/Controllers/Auth/LoginController.php （ログイン後のリダイレクトの指示）
    - app/Http/Controllers/Auth/RegisterController.php （ユーザー登録後のリダイレクトの指示）
    - app/Http/Controllers/Auth/ResetPasswordController.php （パスワードリセット後のリダイレクトの指示）
1. 例えば`app/Http/Middleware/RedirectIfAuthenticated.php`は下記のように記載されている。

    ```アプリ名ディレクトリ/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 $next($request);
        }
    }
    ```

1. 上記の中でリダイレクト処理は`return redirect(RouteServiceProvider::HOME);`の部分である。
1. `redirect()`はカッコの中で指定されたパスにリダイレクトするlaravelのヘルパ関数である。（公式ドキュメント[https://readouble.com/laravel/8.x/ja/helpers.html#method-redirect](https://readouble.com/laravel/8.x/ja/helpers.html#method-redirect)）
1. `RouteServiceProvider::HOME`はRouteServiceProviderクラスのHOMEプロパティを呼び出している。（クラスプロパティとか静的プロパティとか言われる。 筆者が書いた簡単な解説→[https://qiita.com/miriwo/items/974adcee45f699553cd4](https://qiita.com/miriwo/items/974adcee45f699553cd4)）
1. だから`アプリ名ディレクトリ/app/Providers/RouteServiceProvider.php`で定義されているHOME定数を変えてあげることでリダイレクト先の設定が根底から変わり「RedirectIfAuthenticated.php」「LoginController.php」「RegisterController.php」「ResetPasswordController.php」の個々のリダイレクト処理を書き換えなくて良いということ。（各ファイルで`アプリ名ディレクトリ/app/Providers/RouteServiceProvider.php`で定義されているHOME定数を使用してリダイレクト処理を記載しているから）
1. よって前に筆者が書いた下記の記事はよくない記事だった。
    - [Laravel Authで実装したログイン機能 ログイン後のリダイレクト先を/homeから変更する](https://qiita.com/miriwo/items/104eac29bdf4d04307d7)