Laravel Authで実装したログイン機能 ログイン後のリダイレクト先を/homeから変更する

# 目的

- 筆者自身非常に詰まった内容だったため記事としてまとめる

# ありがとうございます

- 本内容を実施するにあたり下記の記事を参考にさせていただきました。
    - [Laravel ログイン中、ログイン画面にアクセスした際のリダイレクト先変更](https://qiita.com/Ioan/items/551d379fe99ffcbd06b4)
- 問題解決に繋がる記事を投稿してくださり本当にありがとうございます。
- 参考にさせていただいた条件と筆者の条件が違いましたので情報として記事にしたいと思います。

# 実施環境

- ハードウェア環境(下記の二つの環境で確認)

| 項目 | 情報 | 備考 | 
| --- | --- | --- |
| OS | macOS Catalina(10.15.3) ||
| ハードウェア | MacBook  Air (11-inch ,2012) ||
| プロセッサ | 1.7 GHz デュアルコアIntel Core i5 ||
| メモリ | 8 GB 1600 MHz DDR3 ||
| グラフィックス | Intel HD Graphics 4000 1536 MB ||

| 項目 | 情報 |
| --- | --- |
| OS | macOS Catalina(10.15.3) |
| ハードウェア | MacBook Pro (16-inch ,2019) |
| プロセッサ | 2.6 GHz 6コアIntel Core i7 |
| メモリ | 16 GB 2667 MHz DDR4 |
| グラフィックス | AMD Radeon Pro 5300M 4 GB Intel UHD Graphics 630 1536 MB |

- ソフトウェア環境

| 項目 | 情報 | 備考 |
| --- | --- | --- |
| PHP バージョン | 7.4.3 | Homwbrewを用いて導入 |
| Laravel バージョン | 7.0.8 | commposerを用いて導入 |
| MySQLバージョン | 8.0.19 for osx10.13 on x86_64 | Homwbrewを用いて導入 |

# 実施条件

- ローカル開発環境にてブラウザから確認する事のできるLaravelアプリがあること。
- Laravelアプリが下記の内容、またはそれに準ずる方法でAuthを用いたログイン機能を有していること。
    - [Mac Laravel 7 Authを用いたユーザ登録 ログイン ログアウトなどの機能を作成する](https://qiita.com/miriwo/items/5d4a94e8d2aa06b61530)

# 実施方法

1. アプリ名ディレクトリで下記コマンドを実行してAuthのリダイレクトの情報が記載されているファイルを開く。

    ```terminal
    $ vi app/Http/Middleware/RedirectIfAuthenticated.php
    ```
1. 下記のような内容が記載されている事を確認する。

    ```アプリ名ディレクトリ/app/Http/Middleware/RedirectIfAuthenticated.php
    <?php
    
    namespace App\Http\Middleware;
    
    use App\Providers\RouteServiceProvider;
    use Closure;
    use Illuminate\Support\Facades\Auth;
    
    class RedirectIfAuthenticated
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @param  string|null  $guard
         * @return mixed
         */
        public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->check()) {
                return redirect(RouteServiceProvider::HOME);
            }
    
            return $next($request);
        }
    }
    ```
1. 先に開いた「RedirectIfAuthenticated.php」を下記の様に書き換える。

    ```アプリ名ディレクトリ/app/Http/Middleware/RedirectIfAuthenticated.php
    <?php
    
    namespace App\Http\Middleware;
    
    use App\Providers\RouteServiceProvider;
    use Closure;
    use Illuminate\Support\Facades\Auth;
    
    class RedirectIfAuthenticated
    {
        /**
         * Handle an incoming request.
         *
         * @param  \Illuminate\Http\Request  $request
         * @param  \Closure  $next
         * @param  string|null  $guard
         * @return mixed
         */
        public function handle($request, Closure $next, $guard = null)
        {
            if (Auth::guard($guard)->check()) {
                return redirect('ログイン後、ユーザ登録後にリダイレクトさせたいURL');
            }
    
            return $next($request);
        }
    }
    ```
1. アプリ名ディレクトリで下記コマンドを実行してAuthのログイン時のリダイレクトの情報が記載されているファイルを開く。

    ```terminal
    $ vi app/Http/Controllers/Auth/LoginController.php
    ```
1. 下記のように記載されている事を確認する。

    ```アプリ名ディレクトリ/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');
        }
    }
    ```
1. 先に開いた「LoginController.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 = 'ログイン後、ユーザ登録後にリダイレクトさせたいURL';
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest')->except('logout');
        }
    }
    ```
1. アプリ名ディレクトリで下記コマンドを実行してAuthのユーザ登録時のリダイレクト情報が記載されているファイルを開く。

    ```terminal
    vi app/Http/Controllers/Auth/RegisterController.php
    ```
1. 下記のように記載されている事を確認する。

    ```アプリ名ディレクトリ/app/Http/Controllers/Auth/RegisterController.php
        <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Providers\RouteServiceProvider;
    use App\User;
    use Illuminate\Foundation\Auth\RegistersUsers;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    
    class RegisterController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Register Controller
        |--------------------------------------------------------------------------
        |
        | This controller handles the registration of new users as well as their
        | validation and creation. By default this controller uses a trait to
        | provide this functionality without requiring any additional code.
        |
        */
    
        use RegistersUsers;
    
        /**
         * Where to redirect users after registration.
         *
         * @var string
         */
        protected $redirectTo = RouteServiceProvider::HOME;;
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest');
        }
    
        /**
         * Get a validator for an incoming registration request.
         *
         * @param  array  $data
         * @return \Illuminate\Contracts\Validation\Validator
         */
        protected function validator(array $data)
        {
            return Validator::make($data, [
                'name' => ['required', 'string', 'max:255'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);
        }
    
        /**
         * Create a new user instance after a valid registration.
         *
         * @param  array  $data
         * @return \App\User
         */
        protected function create(array $data)
        {
            return User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => Hash::make($data['password']),
            ]);
        }
    }
    ```
1. 先に開いた「RegisterController.php」を下記の様に書き換える。

    ```アプリ名ディレクトリ/app/Http/Controllers/Auth/RegisterController.php
    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Providers\RouteServiceProvider;
    use App\User;
    use Illuminate\Foundation\Auth\RegistersUsers;
    use Illuminate\Support\Facades\Hash;
    use Illuminate\Support\Facades\Validator;
    
    class RegisterController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Register Controller
        |--------------------------------------------------------------------------
        |
        | This controller handles the registration of new users as well as their
        | validation and creation. By default this controller uses a trait to
        | provide this functionality without requiring any additional code.
        |
        */
    
        use RegistersUsers;
    
        /**
         * Where to redirect users after registration.
         *
         * @var string
         */
        protected $redirectTo = 'ログイン後、ユーザ登録後にリダイレクトさせたいURL';
    
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('guest');
        }
    
        /**
         * Get a validator for an incoming registration request.
         *
         * @param  array  $data
         * @return \Illuminate\Contracts\Validation\Validator
         */
        protected function validator(array $data)
        {
            return Validator::make($data, [
                'name' => ['required', 'string', 'max:255'],
                'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
                'password' => ['required', 'string', 'min:8', 'confirmed'],
            ]);
        }
    
        /**
         * Create a new user instance after a valid registration.
         *
         * @param  array  $data
         * @return \App\User
         */
        protected function create(array $data)
        {
            return User::create([
                'name' => $data['name'],
                'email' => $data['email'],
                'password' => Hash::make($data['password']),
            ]);
        }
    }
    ```
1. アプリ名ディレクトリで下記コマンドを実行してリセット後のリダイレクト情報が記載されているファイルを開く。

    ```terminal
    $ vi app/Http/Controllers/Auth/ResetPasswordController.php
    ```
1. 下記のように記載されている事を確認する。

    ```アプリ名ディレクトリ/app/Http/Controllers/Auth/ResetPasswordController.php
    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Providers\RouteServiceProvider;
    use Illuminate\Foundation\Auth\ResetsPasswords;
    
    class ResetPasswordController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Password Reset Controller
        |--------------------------------------------------------------------------
        |
        | This controller is responsible for handling password reset requests
        | and uses a simple trait to include this behavior. You're free to
        | explore this trait and override any methods you wish to tweak.
        |
        */
    
        use ResetsPasswords;
    
        /**
         * Where to redirect users after resetting their password.
         *
         * @var string
         */
        protected $redirectTo = RouteServiceProvider::HOME;
    }
    ```
1. 先に開いた「ResetPasswordController.php」を下記の様に書き換える。 

    ```アプリ名ディレクトリ/app/Http/Controllers/Auth/ResetPasswordController.php
    <?php
    
    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    use App\Providers\RouteServiceProvider;
    use Illuminate\Foundation\Auth\ResetsPasswords;
    
    class ResetPasswordController extends Controller
    {
        /*
        |--------------------------------------------------------------------------
        | Password Reset Controller
        |--------------------------------------------------------------------------
        |
        | This controller is responsible for handling password reset requests
        | and uses a simple trait to include this behavior. You're free to
        | explore this trait and override any methods you wish to tweak.
        |
        */
    
        use ResetsPasswords;
    
        /**
         * Where to redirect users after resetting their password.
         *
         * @var string
         */
        protected $redirectTo = 'ログイン後、ユーザ登録後にリダイレクトさせたいURL';
    }
    ```
1. 当該アプリのローカルサーバを起動後、ユーザのログインや新規登録を実施しリダイレクト先を確認する。
    - ログイン→[http://127.0.0.1:8000/login](http://127.0.0.1:8000/login)
    - 新規登録→[http://127.0.0.1:8000/register](http://127.0.0.1:8000/register)