【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)

#オリジナルバリデータの作成
Illuminate\Validation\Validatorクラスを継承したクラスを新しく作成する。

基本形がこれ。

```php5
use Illuminate\validation\Validator;

class クラス名 extends Validator
{
    public function validate〇〇($attribute, $balue, $parameters)
    {
        //バリデーションの処理
        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)
validate〇〇という名前のメソッドを用意する.

例えば、validateAbcという名前で用意すれば'abc'というルールとして扱われる。
またバリデーションの処理をして真偽値を返す。

|真偽値|説明|
|---|---|
|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)
validate〇〇という名前のメソッドを用意する.



##HelloValidatorを作成する
バリデータクラスは手作業で作成していく。
`Http/Validators/HelloValidator.php`というファイルを作ってそこに書いていく

```php5:HelloValidator.php
<?php
namespace App\Http\Validator;

use Illuminate\Validation\Validator;

class HelloValidator extends Validator
{
    public function validateHello($attribute, $value, $parameters)
    {
        return $value%2==0;
    }
}

```
>出典：[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)
validate〇〇という名前のメソッドを用意する.



ここで`return $value%2==0;`を返して、偶数なら許可としている。

###HelloValidatorを組み込む
組み込みにはサービスプロバイダを利用する。

```php5
public function boot()
    {
        $validator=$this->app['Validator'];
        $validator->resolver(function ($translator, $data, $rules, $message) {
            return new HelloValidator($translator, $data, $rules, $message);
        });
    }
```
>出典：[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)
validate〇〇という名前のメソッドを用意する.


バリデータは`$this->app['validator']`に保管されている。
この`resolver`というメソッドで**リゾルブ(バリデーションの処理を行う)**の処理を設定できる。
引数は以下のようなクロージャ

```php5
function ($translator, $data, $rules, $message) {
            return 《Validator》;
        }
```
>出典：[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)
validate〇〇という名前のメソッドを用意する.


ここではバリデータのインスタンスをreturnすることで、このクラスをバリデーションの処理として設定している。

##HelloValidatorのルールを使用する
```php5
class HelloRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        if ($this->path()=='hello') {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
          'name'=>'required',
          'mail'=>'email',
          'age'=>'numeric|hello',
        ];
    }
    public function messages()
    {
        return [
        'name.required'=>'名前は必須項目',
        'mail.email'=>'メアドは必要',
        'age.numeric'=>'整数で記入',
        'age.hello'=>'Hello 入力は偶数のみ受付',
      ];
    }
}
```
>出典：[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)
validate〇〇という名前のメソッドを用意する.


HelloRequestクラスを修正する。
`age`に`numeric|hello`という形で検証ルールを設定
エラーメッセージは`age.hello`を指定して設定。
次はコントローラの修正

```php5
class HelloController extends Controller
{
    public function index(Request $request)
    {
return view('hello.index',['msg'=>'フォームを入力']);
    }
    public function post(Request $request)
    {
      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)
validate〇〇という名前のメソッドを用意する.


これで/helloにアクセスする

###Validator::extendを利用する
独自のバリデータクラスの作成をしないほどのカスタマイズしたい場合にはValidatorクラスのextendメソッドを使う

```php5
Validator::extends(名前,クロージャ);
```
>出典：[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)
validate〇〇という名前のメソッドを用意する.


これで第1引数に指定した名前で第2引数のクロージャをルールとして追加する。

```php5:第2引数のクロージャ
function($arrtivute,$value,$parameters,$validator){
  //バリデーションの処理
  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)
validate〇〇という名前のメソッドを用意する.


`$arrtivute,$value,$parameters`の引数に加えてバリデータのインスタンスを渡す。

これを使って先の独自バリデータクラスを同じことをしてみる。
HelloServiceProvierクラスを修正する。

```php5
public function boot()
    {
        Validator::extend('hello', function ($arrtivute, $value, $parameters, $validator) {
            return $value%2==0;
        });
    }
```
>出典：[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)

validate〇〇という名前のメソッドを用意する.


Validator::extendは手軽だが汎用性がない。
1つのコントローラでしか使わないルールはこれで作り
いくつものコントローラで利用する場合はバリデーションクラスを作るという使い分けが良い。