Chapter4　バリデーション（4-2）

# バリデーションとは？

バリデーションは「入力情報を検証するための仕組み」です。
Laravelではコントローラの「validate」メソッドを利用します。


ValidateRequestsというトレイと（メンバーをまとめてクラス追加するためのもの）に
利用されているクラスです。

```sample.php
$this->validate($request,[***検証設定の配列*]);
```
```sample.php
[
     '**項目名**'　=> '割り当てる検証ルール',
     '**項目名**'　=> '割り当てる検証ルール',

     ];
```

# バリデーションを利用する

```index.php
@section('content')

    <p>{{$msg}}</p>
    <form action="/hello" method="post">
        <table>
            @csrf
            <tr><th>name: </th><td><input type="text" name="name"></td></tr>
            <tr><th>mail: </th><td><input type="text" name="mail"></td></tr>
            <tr><th>age: </th><td><input type="text" name="age"></td></tr>
            <tr><th></th><td><input type="submit" value="send"></td></tr>
        </table>
    </form>

@endsection
```

```HelloController.php
class HelloController extends Controller
{
    public function index(Request $request) {

        return view('hello.index',['msg'=>'フォームを入力']);

    }

    public function post(Request $request) {

        $validate_rule = [

            'name' => 'required',
            'mail' => 'email',
            'age' => 'numeric|between:0,150',

        ];

        $this->validate($request, $validate_rule);

        return view('hello.index',['msg'=>'正しく入力されました！']);

    }

}
```

```web.php
Route::get('hello','App\Http\Controllers\HelloController@index');
Route::post('hello','App\Http\Controllers\HelloController@post');
```

## バリデーションの基本処理

```sample.php
'name' => 'required',
```
上記はnameという項目に、「required」というルールを設定することを指します。

```sample.php
'age' => 'numeric|between:0,150',
```
上記は[age]という項目に。「numeric」と「betweeen」の２つのルールを設定していることを指します。

バリデーションの実行が、「validate」メソッドで行っています。

```sample.php
$this->validate($request, $validate_rule);
```


## エラーメッセージの利用

```index.php
@section('content')

    <p>{{$msg}}</p>
    <form action="/hello" method="post">
        <p>{{$msg}}</p>
        @if (count($errors) > 0)
            <div>
                <ul>
                    @foreach($errors->all() as $error)
                        <li>{{$error}}</li>
                    @endforeach
                </ul>
            </div>
        @endif
        <table>
            @csrf
            <tr><th>name: </th><td><input type="text" name="name"></td></tr>
            <tr><th>mail: </th><td><input type="text" name="mail"></td></tr>
            <tr><th>age: </th><td><input type="text" name="age"></td></tr>
            <tr><th></th><td><input type="submit" value="send"></td></tr>
        </table>
    </form>

@endsection
```

```sample.php
@if (count($errors) > 0)
         **メッセージの表示処理**
@endif
```
```sample.php
@foreach($errors->all() as $error)
       <li>{{$error}}</li>　　　　**メッセージの表示**
@endforeach
```

```sample.php
<input type="text" name="name" value="{{old('name')}}">
```

インプットタグの`value`に`{{old('name')}}`を追加すると、
フォームに入力した値を表示することができる。

### それぞれの項目でエラーメッセージを表示する

```sample.php
@if ($errors->has('name'))
     <tr><th>ERROR</th><td>{{$errors->first('name')}}</td></tr>
@endif
```
ここで出てくる`@if ($errors->has('name'))`はname項目で
エラーが発生しているかどうかを判定しているメソッド。

```sample.php
$errors->has(**項目名**)
```

指定した項目の最初のエラーメッセージを取得するように、
するためには、「first」というメソッドを使用します。

```sample.php
first(**項目名**)
```

最初のエラーメッセージだけではなく、
全て取得した場合は「get」メソッドを使用します。

```sample.php
$変数 = $errors->get(項目名);
```

### ＜エラーメッセージ取得のためのメソッド＞

| メソッド | 用途 |
|:-:|:-:|
| all | 全てのエラーメッセージを配列で取得  |
| first  | 指定した硬毛の最初のエラーメッセージを文字列で取得  |
| get  | 指定した項目のエラーメッセージ全てを配列で取得  |


## `@error`ディレクティブを使う

エラーメッセージを表示するのに、
`@if`ディレクティブを使って、`$errors->has()`の値が「true」ならば、
`$errors->first();`や`$errors->get();`でエラーメッセージを取り出して表示するのは面倒。

ここで、
`@error`ディレクティブを使うことで、簡単に実装できます。(Larabel 5.8〜)

```sample.php
@error(名前)
**$messageでメッセージを表示**
@enderror
```

```index.php
<table>
            @csrf
            @error('name')
                <tr><th>ERROR</th>
                <td>{{$message}}</td></tr>
            @enderror
            <tr><th>name: </th><td><input type="text" name="name" value="{{old('name')}}"></td></tr>
            @error('mail')
            <tr><th>ERROR</th>
                <td>{{$message}}</td></tr>
            @enderror
            <tr><th>mail: </th><td><input type="text" name="mail" value="{{old('mail')}}"></td></tr>
            @error('age')
            <tr><th>ERROR</th>
                <td>{{$message}}</td></tr>
            @enderror
            <tr><th>age: </th><td><input type="text" name="age" value="{{old('age')}}"></td></tr>
            <tr><th></th><td><input type="submit" value="send"></td></tr>
        </table>
```
# バリデーションの検証ルール

## 必須項目のバリデーションルール

| 検証ルール名 | 検証ルール | 
|:-----------|------------:|
| required   | 必須項目である      |
| ***        | ***   　     |

*時間があれば追記

## 検証ルール

| 検証ルール名 | 検証ルール | 
|:-----------|------------:|
| accept     | 「true・on・yes・1」といった値がどうかの判定<br>（チェックボックスの判定に使用） |
| active_url<br>url | ドメインが実際に有効なものどうかを判定      | 
| after:日付 <br>after_or_equal:日付 | 指定した日付よりもあとであるを判定 |
| ***         | ***          |

*時間があれば追記