Laravel 認証のルート定義からログイン/ログアウトのみ残して他を削除する

ログイン・ログアウトのみ残して、他の認証系機能を制限したかったので調べてみました。

## 検証バージョン
Laravel 5.7 5.8

## 認証スキャフォルド
下記のコマンドを実行すると`routes/web.php` に１行、ルート定義を自動で行ってくれるメソッド呼び出しが追加されます。

```php
$ php artisan make:auth
```

``` php:routes/web.php
Auth::routes();
```

## Auth::routes() の実装

```php:vendor/laravel/framework/src/Illuminate/Routing/Router.php
public function auth(array $options = [])
{
    // Authentication Routes...
    $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
    $this->post('login', 'Auth\LoginController@login');
    $this->post('logout', 'Auth\LoginController@logout')->name('logout');

    // Registration Routes...
    if ($options['register'] ?? true) {
        $this->get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
        $this->post('register', 'Auth\RegisterController@register');
    }

    // Password Reset Routes...
    if ($options['reset'] ?? true) {
        $this->resetPassword();
    }

    // Email Verification Routes...
    if ($options['verify'] ?? false) {
        $this->emailVerification();
    }
}
```

認証に必要なルート定義が書かれています。

引数にオプションを渡せるようです。
`register` `reset` `verify` をそれぞれキーに boolean 値を渡せば良さそうです。

ちなみに `$this->resetPassword()` `$this->emailVerification()` の実装は下記の通りでした。

```php:vendor/laravel/framework/src/Illuminate/Routing/Router.php
public function resetPassword()
{
    $this->get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
    $this->post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
    $this->get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
    $this->post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');
}
```

```php:vendor/laravel/framework/src/Illuminate/Routing/Router.php
public function emailVerification()
{
    $this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
    $this->get('email/verify/{id}', 'Auth\VerificationController@verify')->name('verification.verify');
    $this->get('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
}
```

やはりルート定義を行っているだけのようです。


## 結論

オプションを渡してルート定義を制御しましょう。

``` php:routes/web.php
Auth::routes(['register' => false, 'reset' => false, 'verify' => false]);
```

ルーティングリストからも消えています。

```php
$ php artisan route:list
```

```
+--------+-----------+-----------------------------------------------+------------------------------------+---------------------------------------------------------------+------------------------------------------------------+
| Domain | Method    | URI                                           | Name                               | Action                                                        | Middleware                                           |
+--------+-----------+-----------------------------------------------+------------------------------------+---------------------------------------------------------------+------------------------------------------------------+
|        | GET|HEAD  | login                                         | login                              | App\Http\Controllers\Auth\LoginController@showLoginForm       | web,guest                                            |
|        | POST      | login                                         |                                    | App\Http\Controllers\Auth\LoginController@login               | web,guest                                            |
|        | POST      | logout                                        | logout                             | App\Http\Controllers\Auth\LoginController@logout              | web                                                  |
```