【Laravel】ユーザ認証機能で追加されるファイル

###ユーザ認証機能で追加されるファイルをまとめます

####経緯
作ったファイルにユーザ認証機能を追加しようとして、いろんなサイトや動画みましたが、最初のwelcomeページの右上に表示されるようにする説明が多かったです。

そのままでログインのページとして使用すればいいのでしょうが、すでにあるアプリに追記しようとしたら、どこに何がどんなものが記述されているかがわかっていないと、勝手に書き換えるのも怖いなと思いました。

####追加されるファイル
エディタ上で確認しました。

- app/Http/Controllers/Authの中に 
    - Auth/ConfirmPasswordController.php
    - Auth/ForgotPasswordController.php
    - Auth/LoginController.php
    - Auth/RegisterController.php
    - Auth/ResetPasswordController.php
    - Auth/VerificationController.php
    - HomeController.php
- database/migrationsの中に
    - create_password_reset
- publicの中に
    - css/app.css
    - js/app.js
    - mix-manifest.json
- resourcesの中に
    - views/auth/の中に
        - passwords/confirm.blade.php
        - passwords/email.blade.php
        - passwords/reset.blade.php
        - login.blade.php
        - register.blade
        - verify.blade.php
        - layouts/app.blade.php
        - home.blade.php


####Web.phpに追記がありました

```php5:web.php
Auth::routes();
```
ここではルーティングの設定は書いていなくて、

vendor/laravel/ui/auth-backend/AuthRouteMethods.php
の中にあるようです。

このvendor/laravel/uiも追加されたみたいですね。いままでvendorの中身はみたことなかったですが。

AuthRouteMethods.phpの中身はこんな感じでした↓

```php5:AuthRouteMethods.php
<?php

namespace Laravel\Ui;

class AuthRouteMethods
{
    /**
     * Register the typical authentication routes for an application.
     *
     * @param  array  $options
     * @return callable
     */
    public function auth()
    {
        return function ($options = []) {
            // Login Routes...
            if ($options['login'] ?? true) {
                $this->get('login', 'Auth\LoginController@showLoginForm')->name('login');
                $this->post('login', 'Auth\LoginController@login');
            }
            
            // Logout Routes...
            if ($options['logout'] ?? true) {
                $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();
            }

            // Password Confirmation Routes...
            if ($options['confirm'] ??
                class_exists($this->prependGroupNamespace('Auth\ConfirmPasswordController'))) {
                $this->confirmPassword();
            }

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

    /**
     * Register the typical reset password routes for an application.
     *
     * @return void
     */
    public function resetPassword()
    {
        return function () {
            $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');
        };
    }

    /**
     * Register the typical confirm password routes for an application.
     *
     * @return void
     */
    public function confirmPassword()
    {
        return function () {
            $this->get('password/confirm', 'Auth\ConfirmPasswordController@showConfirmForm')->name('password.confirm');
            $this->post('password/confirm', 'Auth\ConfirmPasswordController@confirm');
        };
    }

    /**
     * Register the typical email verification routes for an application.
     *
     * @return void
     */
    public function emailVerification()
    {
        return function () {
            $this->get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
            $this->get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
            $this->post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');
        };
    }
}
```

何やらいっぱい書かれております。

###とりあえず重要そうなURL

|処理・表示|URL|
|:--|:--|
|ログインページ|localhost:8888/login|
|登録ページ|localhost:8888/register|
|最初のページホーム|localhost:8888/|
|ログイン後のホーム画面|localhost:8888/|

このあたりはlaravel/uiに入っているみたいですね。
viewやらを返す設定ページがあるので、web.phpには明記されず、Auth::routes()で引っ張って来ているみたいですね。便利です。

しかし、初心者にはどこをどう変えたらどうなるのかがわからないところがフレームワークの良いところですね。


###ログインしていないのに直接URLを叩いてログイン後のホーム画面にjavascriptでホーム画面にリダイレクトさせる

実際自分がすでに作ったアプリにログイン認証を追加しようとしたときに、ログイン前の画面にリダイレクトさせようとして、下記の動画では

```javascript:
<script>window.location = "/home";</script>
```
*参考にした動画*
https://www.youtube.com/watch?v=OUFmwAnFclo&t=1047s

自分ですでにルーティングで使用していたらおかしなことになる。
アプリの名前が表示される画面にリダイレクトするなら

```javascript:
<script>window.location = "/";</script>
```

としましょう。

プロジェクトを作成した時点ではweb.phpには下のように記述があるはず。

```php5：web.php
Route::get('/', function () {
    return view('welcome');
});
```

認証機能を有効にして諸々実行して、`右上にloginとregisterのリンクが出てきましたね`って説明があるあのページです。

welcome.blade.phpを消してなかったらちゃんと表示されるはず。


###まとめ

1. welcome.blade.phpを編集してログイン画面を作る。
2. 自分のアプリをURLがかぶらないように作る
3. ログイン後の画面を自分のアプリのホーム画面にする
4. ヘッダーにログイン済かどうかのチェックをAuthファサードをしようして、ログイン済じゃなかったらwelcome.blade.phpのページにリダイレクトする


この流れで考えれば初心者にはログイン機能実装が流れとしては考えやすいと思います。