【laravel】validateメソッドによるバリデーション

# 概要
laravelではいくつかの方法でバリデーションをかけることができます。
そのため一度に投稿するとボリュームが多くなるので複数回に分けます。

[・Validatorによるバリデーション]()
[・FormRequestによるバリデーション]()
[・ruleオブジェクトによる検証ルールの追加]()
[・バリデーションエラーの表示と日本語化]()

# validateクラスとは
validateメソッドはControllerクラスに組み込まれている`Illuminate\Http\Request`オブジェクトのメソッドを使います。
validateメソッドでは、POSTされた値のバリデーションに成功するとコードは通常通り続けて実行され、バリデーションに失敗すると自動的に例外が投げられてユーザーにエラーメッセージが返されるため手軽にバリデーションを実行できます。

# コントローラーとルーティングの作成
例としてFormControllerでバリデーションのコードを記述するため、コントローラーとルーティングを作成します。

## ルートの定義
FormControllerクラスのpostValidatesメソッドへのルーティングを記述します。

```php:web
Route::post('sample', 'FormController@postValidates');
```

## コントローラーの作成
バリデーションを実行するFormControllerクラスを作成します。
Controllerの作成なので段落だけ付けて詳細は割愛します。

### コマンド
```:コマンド
php artisan make:controller FormController
```

### ディレクトリ構造

```:ディレクトリ
app
├─ Http
|  ├─ Controllers
|  |  ├─ FormController.php
```

### 作成されるファイル

```php:FormController
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class FormController extends Controller
{
    //
}
```

# バリデーションの作成
作成したFormControllerにpostValidatesというメソッドを作成してバリデーションの処理を記述していきます。
（ここのメソッド名はなんでもいいです。）

```php:FormController
public function postValidates(Request $request)
{
 //
}
```

## バリデーションの記述
validateメソッドは`$request->validate(['検証の配列'])`または`$this->validate($request,[検証の配列]);`で作成します。
reurnはバリデーションが成功した際にビューで出力する値です。
記述例は載せますが解説は前者で統一します。

```php:FormController
public function postValidates(Request $request)
{
  $request->validate([
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ];)
  return view('sample.index',['msg'=>'OK']);}
}

// 記述方法：$request->validate(['検証の配列']);
```

```php:FormController
public function postValidates(Request $request)
{
  $validate_rule = [
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ];
  $this->validate($request,$validate_rule);
  return view('sample.index',['msg'=>'OK']);
}

// 記述方法：$this->validate($request,[検証の配列]);
```

## validateメソッドの配列
連想配列で`['postしてきた値'=>'検証ルール']`となっています。
検証ルールを複数設けたい場合は検証ルールの間に`|`を入れて区切ります。
もしくは、配列のバリュー（検証ルール）を配列にして`,`で区切って記述することもできます。

```php:FormController
$request->validate([
  'name' => 'required',
  'age' => 'integer | between:0,150',
  'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
];)
// 記述方法：['検証する値'=>'検証ルール1 | 検証ルール2',]
// もしくは、['検証する値'=>['検証ルール1', '検証ルール2'],]
```

```:使用した検証ルール
required：何かしらの値があること
integer：半角整数であること
between:a,b：aからbまでの数字
max:a：文字数の最大値がa個
regex:：PHPのpreg_match関数
```

## エラーメッセージのカスタマイズ
エラーメッセージをカスタマイズするには、第2引数にエラーメッセージを記述します。
ただし、エラーメッセージは検証ルールごとに設定する必要があるため、エラーメッセージの設定がない検証ルールはデフォルトのエラーメッセージが返されます。

```php:FormController
public function postValidates(Request $request)
{
  $request->validate([
    'name' => 'required',
    'age' => 'integer | between:0,150',
    'sex' => ['max:1', 'regex:/^[男|女]+$/u'],
  ],
  [
    'name.required' => '名前を入力してください',
    'age.numeric' => '整数で入力してください',
    'age.between' => '0～150で入力してください'
    'sex.regex' => '男か女で入力してください',
  ]);
  return view('sample.index',['msg'=>'OK']);}
}
```

```:表示例
name（required）：名前を入力してください
age（integer）：整数で入力してください
age（between）：0～150で入力してください
sex（max:1）：The sex may not be greater than 1 characters.
sex（regex:/^[男|女]+$/u）：男か女で入力してください
```


# 参考
[
Laravel 6.x バリデーション]
(https://readouble.com/laravel/6.x/ja/validation.html)
[Laravelのvalidationメソッドでバリデーションを実装する入門編]
(https://www.ritolab.com/entry/40)
[入門者のためのLaravelのValidationとエラーメッセージ]
(https://reffect.co.jp/laravel/laravel_validation_understanding)
[はじめてLaravel6.0：バリデーション追加＆カスタムバリデーション／入力画面（２）]
(https://arakan-pgm-ai.hatenablog.com/entry/2019/10/30/000000)
[【保存版】バリデーションルールまとめ]
(https://www.wakuwakubank.com/posts/376-laravel-validation/)