【Laravel】バリデーション 復習


この記事は以下の書籍を参考にして執筆しました。

- [PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

#バリデーション
- コントローラでバリデーション(簡単)
- フォームリクエストを使う
- バリデータを使う

##コントローラでバリデーション
コントローラの基底クラスValidateRequestという**トレイト**の機能。
基本的にコントローラにあるメソッドと思ってもらって一向に構わない。

```php5
$this->validate($request,[検証設定の配列]);
```

```php5:検証設定の配列
[
  'フォームの項目名'=>'検証ルール',
  'フォームの項目名'=>'検証ルール',
  ...
]
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

##フォームリクエストを使う
コントローラではないところでバリデーションをする。
###フォームリクエスト
リクエストをフォーム利用のために拡張したもの。
Requestクラスを拡張してFromRequestが作成される。
###FromRequestのメソッド
フォームリクエストをartisaで、例えばHelloRequestという名前で作成するとHelloRequestクラスはFromRequestを継承している。
FromRequestはリクエスト機能をベースに、バリデーションなどのフォーム処理機能が追加されている。

FromRequestには以下のメソッドがある
####authorize
フォー0無リクエストを利用するアクションでフォームリクエストの利用が許可されているかどうかを示す。戻り値は真偽値。

|真偽値|説明|
|---|---|
|true|許可|
|false|不許可。例外が発生してフォーム処理できなくなる|
####rules
検証値ルールを設定。

###メッセージのカスタマイズ
FromRequestのmessageをオーバーライドする。

```php5
public function message(){
  return [
    '項目名.検証ルール'=>'エラーメッセージ',
    '項目名.検証ルール'=>'エラーメッセージ',
    ...
  ];
}
```

##バリデータを使う
コントローラでValidatorクラスのインスタンスを作成して処理する。

```php5:コントローラ
//use Validator; を追加する
public function post(Request $request){
  $validator=Validator::make($request->all(),$rules);
  if($validator->fails()){
    return redirect('hello')->withError($validator)->withInput();
  }
  return view('hello.index',['msg'=>'正しい入力']);
}
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

###バリデータの基本
Validatorインスタンスの作成はmakeを使って行う

```php5
$validator=Validator::make(値の配列,ルール配列);
```

|引数|説明|
|---|---|
|第1引数|チェックする値をまとめた配列|
|第2引数|検証ルール|

フォームをそのままチェックするなら$request->all()でOK

###エラーチェック

```php5
  if($validator->fails()){...
```
####fails
|返り値|説明|
|---|---|
|true|バリデーションエラー発生|
|false|問題なし|

####passes
同じ機能としてpassesというメソッドもある
これはfailsのときと**逆**。

|返り値|説明|
|---|---|
|true|問題ない|
|false|バリデーションエラー発生|


###入力フォームのリダイレクト
このスクリプトはエラーが発生したらフォームページへ戻るようにしている。

```php5
redirect('hello')->withError($validator)->withInput();
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

|メソッド|説明|
|---|---|
|redirect|指定のアドレスへ移動|
|withErrors|Validatorで発生したエラーメッセージをリダイレクト先まで引き継ぐ|
|withInput|送信されたフォームをリダイレクト先まで引き継ぐ|

###クエリ文字列のバリデータを適応する
Validatorインスタンス作成の第1引数にクエリ文字列の配列値を渡す。
第2引数には項目を書く。

```php5
$validator=Validator::make($request->query(),[
  'id'=>'required',
  'pass'=>'required'
]);
```

`$request->query()`はこんな感じになる。

```php5
// アクセスしたアドレスが「/hello?id=taro&pass=yamada」なら
[
  'id'=>'taro',
  'pass'=>'yaamda'
]
```
###エラーメッセージのカスタマイズ
Validatorインスタンス作成時、第3引数へ指定する。

```php5
$validator=Validator::make(値の配列,ルール配列,エラーメッセージ配列);
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

メッセージは`'項目名.検証ルール'=>'エラーメッセージ'`を配列にしたもの。
まぁいつもの。

###条件に応じてルールを追加

```php5
$validator->sometimes(項目名、ルール名、クロージャ)
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)

sometimesを処理した結果によってルールを追加する。

クロージャがルールを追加すべきかを決定する。

```php5:クロージャはこんな感じ
function ($input){
  //処理
  return 値;
}
```
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


|項目|説明|
|---|---|
|$input|入力された値をまとめたもの|
|値|ルールを追加すべきかを決める。trueなら何もしない。falseならルール追加。|
>出典：[PHPフレームワークLaravel入門 第2版](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AFLaravel%E5%85%A5%E9%96%80-%E7%AC%AC2%E7%89%88-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798060992/ref=tmm_hrd_title_0?_encoding=UTF8&qid=1595991312&sr=1-2)


`$input->name`という具合で取り出せる。