【Laravel6.x】authのバリデーション作成手順

## 問題
auth(ログイン/新規登録/メール再設定)にバリデーションを適用させたい

## 前提条件
### 通常のバリデーションができていること
https://qiita.com/honaki/items/3be70923c55deff9c8eb

## ログイン
### 手順
①コントローラー
②ビュー
③日本語化

### ①コントローラー
```app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
protected function validateLogin(Request $request)
{
    $request->validate([
        // username = return $request->only($this->username(), 'password');
        // 下の方に記載あり

        // email:filter = 平仮名、カタカナ、漢字、@の後にドットが最低一つなければバリデーションで弾く
        $this->username() => 'required|string|email:filter|max:255',
        'password' => 'required|string|min:8|max:50',
    ]);
}
```

#### 解説
「app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php」は以下の手順で繋がっている。

```web.php
Auth::routes();
```
↓
```app/Http/Controllers/Auth/LoginController.php
use Illuminate\Foundation\Auth\AuthenticatesUsers;
```
↓
```app/vendor/laravel/framework/src/Illuminate/Foundation/Auth/AuthenticatesUsers.php
```

##### email:filter
https://takuma-it.com/laravel-email-validation/

### ②ビュー
```views/auth/login.blade.php
<form class="mt-5" action="{{ route('login') }}" method="POST">
  @csrf
  <div class="form-group">
    <label for="email">メールアドレス</label>
    // ↓⭐️ここ value="{{ old('name属性') }}　 = バリデーションで引っかかってもデータが残る。再入力のだるさを解消。
    <input type="text" class="form-control" id="email" name="email" placeholder="メールアドレスを入力" value="{{ old('email') }}">
    // ↓⭐️ここ @error('name属性')
    @error('email')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
  </div>
  <div class="form-group">
    <label for="password">パスワード</label>
    <input type="password" class="form-control" id="password" name="password" placeholder="パスワードを入力">
    // ↓⭐️ここ @error('name属性')
    @error('password')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
    <small id="emailHelp" class="form-text text-muted text-right"><a href="{{ route('password.request') }}">※パスワードを忘れた方はこちら</a></small>
  </div>
  <div>
    <button type="submit" class="btn btn-primary">ログインする</button>
    <small id="emailHelp" class="form-text text-muted text-right"><a href="{{ route('register') }}">※会員登録はこちら</a></small>
  </div>
</form>
```

#### ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。

https://www.newt.so/docs/form-app-validation-with-html5-form

### ③日本語化
```resorces/lang/ja/validation.php
return [
    //　⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],
```


## 新規登録
### 手順
①コントローラー
②ビュー
③日本語化

### ①コントローラー
```app/Http/Controllers/Auth/RegisterController.php
protected function validator(array $data)
{
    return Validator::make($data, [
        // unique:users = 同じメアドの登録を弾く
        'email' => ['required', 'string', 'email:filter', 'max:255', 'unique:users'],
        'name' => ['required', 'string', 'max:20', ],
        // confirmed = 確認用PWと「完全一致」ではない時に弾く
        'password' => ['required', 'string', 'min:8', 'max:50', 'confirmed'],
        'password_confirmation' => ['required', 'string', 'min:8', 'max:50'],
    ]);
}
```

#### 解説
「app/Http/Controllers/Auth/RegisterController.php」は以下の手順で繋がっている。

```web.php
Auth::routes();
```
↓
```app/Http/Controllers/Auth/RegisterController.php
ここ
```

### ②ビュー
```views/auth/register.blade.php
<form class="mt-5" action="{{ route('register') }}" method="POST">
  @csrf
  <div class="form-group">
    <label for="email">メールアドレス</label>
    // ↓⭐️ここ value="{{ old('name属性') }}
    <input type="text" class="form-control" id="email" name="email" placeholder="メールアドレスを入力" autocomplete="email" value="{{ old('email') }}">
    // ↓⭐️ここ @error('name属性')
    @error('email')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
  </div>
  <div class="form-group">
    <label for="name">ユーザー名</label>
    // ↓⭐️ここ value="{{ old('name属性') }}
    <input type="text" class="form-control" id="name" name="name" placeholder="名前を入力" autocomplete="name" value="{{ old('name') }}">
    // ↓⭐️ここ @error('name属性')
    @error('name')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
  </div>
  <div class="form-group">
    <label for="password">パスワード</label>
    <input type="password" class="form-control" id="password" name="password" placeholder="パスワードを入力">
    // ↓⭐️ここ @error('name属性')
    @error('password')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
  </div>
  <div class="form-group">
    <label for="password_confirmation">パスワード再入力</label>
    <input type="password" class="form-control" id="password_confirmation" name="password_confirmation" placeholder="パスワードを再入力">
    // ↓⭐️ここ @error('name属性')
    @error('password_confirmation')
        <div class="text-danger"><span>{{ $message }}</span></div>
    @enderror
  </div>
  <div>
    <button type="submit" class="btn btn-primary">新規登録する</button>
  </div>
  <small class="form-text text-muted text-right"><a href="{{ route('login') }}">※ログインへ戻る</a></small>
</form>
```

#### ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。

https://www.newt.so/docs/form-app-validation-with-html5-form

### ③日本語化
```resorces/lang/ja/validation.php
return [
    //　⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],
```

## メール再設定(メール送信前)
### 手順
①コントローラー
②ビュー
③日本語化

### ①コントローラー
```vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|string|email:filter']);
}
```

#### 解説
「vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php」は以下の手順で繋がっている。

```web.php
Auth::routes();
```
↓
```app/Http/Controllers/Auth/ForgotPasswordController.php
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
```
↓
```vendor/laravel/framework/src/Illuminate/Foundation/Auth/SendsPasswordResetEmails.php
protected function validateEmail(Request $request)
{
    $request->validate(['email' => 'required|string|email:filter']);
}
```

### ②ビュー
```views/auth/passwords/email.blade.php
<form method="POST" action="{{ route('password.email') }}">
    @csrf
    <div class="form-group row">
        <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
        <div class="col-md-6">
            // ↓⭐️ここ value="{{ old('name属性') }}"
            <input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" autocomplete="email" autofocus>
            // ↓⭐️ここ @error('name属性')
            @error('email')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
```

#### ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。

https://www.newt.so/docs/form-app-validation-with-html5-form

### ③日本語化
```resorces/lang/ja/validation.php
return [
    //　⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],
```

## メール再設定(メールURLクリック後)
### 手順
①コントローラー
②ビュー
③日本語化

### ①コントローラー
```vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php
protected function rules()
{
    return [
        'token' => 'required',
        'email' => 'required|string|email:filter|max:255',
        'password' => 'required|min:8|max:50|confirmed',
        'password_confirmation' => 'required|string|min:8|max:50',
    ];
}
```

#### 解説
「vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php」は以下の手順で繋がっている。

```web.php
Auth::routes();
```
↓
```app/Http/Controllers/Auth/ResetPasswordController.php
use Illuminate\Foundation\Auth\ResetsPasswords;
```
↓
```vendor/laravel/framework/src/Illuminate/Foundation/Auth/ResetsPasswords.php
protected function rules()
{
    return [
        'token' => 'required',
        'email' => 'required|string|email:filter|max:255',
        'password' => 'required|min:8|max:50|confirmed',
        'password_confirmation' => 'required|string|min:8|max:50',
    ];
}
```

### ②ビュー
```resources/views/auth/passwords/reset.blade.php
<form method="POST" action="{{ route('password.update') }}">
    @csrf
    <input type="hidden" name="token" value="{{ $token }}">
    <div class="form-group row">
        <label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
        <div class="col-md-6">
            // ↓⭐️ここ value="{{ old('name属性') }}"
            <input id="email" type="text" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ $email ?? old('email') }}" autocomplete="email" autofocus>
            // ↓⭐️ここ @error('name属性')
            @error('email')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    <div class="form-group row">
        <label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
        <div class="col-md-6">
            // ↓⭐️ここ value="{{ old('name属性') }}"
            <input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password"  autocomplete="new-password">
            // ↓⭐️ここ @error('name属性')
            @error('password')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
    <div class="form-group row">
        <label for="password_confirmation" class="col-md-4 col-form-label text-md-right">{{ __('Confirm Password') }}</label>
        <div class="col-md-6">
            // ↓⭐️ここ value="{{ old('name属性') }}"
            <input id="password_confirmation" type="password" class="form-control @error('password_confirmation') is-invalid @enderror" name="password_confirmation" autocomplete="new-password">
            // ↓⭐️ここ @error('name属性')
            @error('password_confirmation')
                <span class="invalid-feedback" role="alert">
                    <strong>{{ $message }}</strong>
                </span>
            @enderror
        </div>
    </div>
```

#### ポイント
inputタグにフォームバリデーション「required」が合ったら外す
理由は、LaravelよりHTMLのバリデーションが優先されてLaravel方が表示されなくなってしまうから。

https://www.newt.so/docs/form-app-validation-with-html5-form

### ③日本語化
```resorces/lang/ja/validation.php
return [
    //　⭐️return内のバリデーション該当箇所を日本語にする
]

// ⭐️:attributeも修正する
// 「inputタグのname属性 => ‘表示名」にすることで上記return[]内の「:attribute」も日本語にできる。
'attributes' => [
    'email'=>'メールアドレス',
    'name'=>'ユーザー名',
    'password'=>'パスワード',
    'password_confirmation'=>'パスワード再入力',
    'amount'=>'金額',
    'title'=>'タイトル',
    'date'=>'日付',
    'file'=>'ファイル',
],
```

## 参考サイト
https://reffect.co.jp/laravel/laravel-authentification-by-code-base