バリデーションのカスタマイズ＃３

##条件に応じてルールが変更できるようにする

例えばフォームに連絡先を入力できるとして
それが「メールアドレス」または「電話番号」どちらかえらんで入力できるようにしたい時
それぞれのエラーの条件が変わってくる。

その時には「sometimes」というメソッドが使えるらしい。

`$validator->sometimes(項目名、ルール名、クロージャ)`
ここでクロージャってなんなん？
ってなる。

ルールをついかするべきかどうか判断するものらしい

`function($input){
  処理を実行
　　　return 真偽値;
}`

input には入力された値をまとめたものがくる。
戻り値は真偽値になり　true なら何も処理がない
falseなら　sometimes で指定したルールが適用される。

```php:Controller
public function post(Request $request)
{
    $rules = [
         'name' => 'required',
         'mail' => 'email',
         'age' => 'numeric',
    ];
    $message = [
         'name.required' => '名前が入力されていません',
         'mail.email' => 'メールアドレスが必要です',
         'age.numeric' => '年齢は整数で入力してください',
         'age.min' => '年齢は０歳以上で入力してください',
         'age.max' => '年齢は１５０歳以下で入力してください',
    ];
    $validator = Validator::make($request->all(), $rules, $messages);

    $validator->sometimes('age', 'min:0', function($input){
         return !is_int($input->age);  
    });
   
    $validator->sometimes('age', 'max:150', function(input){
         return !is_int($input->age);
    });

    if ($validator->fails()){
         return redirect('/hello')
             ->withErrors($validator)
             ->withInput();
    }
    return view('hello.index',['msg'=>'正しく入力されました']);
}
```

##自分でバリデータのルールが作れる！

```php
use Illuminate\Validation\Validator;

class クラス名　extends Validator
{
    public function validate 〇〇($attribute, $value, $parameters)
    {
      バリデーションの処理
      return 真偽値;
    }
}
```

〇〇に入れた言葉がそのバリデーションのルールとして認識される。
「ValidateAbc」という名前にしたら'abc'というルールになる

第1引数　属性（設定したコントロール名など）
第２引数　チェックする値
第３引数　ルールに渡されるパラメータ

実際に使ってみる
コマンドとかで作ったりできないので
手作業。
Http/Validators/〇〇Validator.php
フォルダ（Validators）とファイル（Validator.php）を作成する

```php:Http/Validators/〇〇Validator.php
<?php 
namespace App\Http\Validators;

use Illuminate\Validation\Validator;

class 〇〇Validator extends Validator
{
   public function validate〇〇（$attribute, $value, $parameters）
   {
       return $value % 2 == 0;
   }
}
```

〇〇Validatorというクラス名を作成
この中にvalidate〇〇というメソッドが用意してある。
‘〇〇’というルールがこれで作成される。

'$value % 2 == 0'すなわち入力されてきた値が偶数なら許可
奇数なら不可となる！

そしてこの作成した〇〇Validatorを組み込んでみる。
サービスプロバイダ必要なので
作る。
サービスプロバイダについてはまた書くことにします。
コマンドで作成せねば。
（参考書に従って進んでいてそこの部分を飛ばして進んでた汗）

〇〇サービスプロバイダがあるとして、、、、、、
providers/〇〇ServiceProvider.phpを開いて
その中の「bootメソッド」を書き換え

```php:providers/〇〇ServiceProvider.php
// use Validator;
// use App\Http\Validators\HelloValidator;

public function boot()
{
    $validator = $this->app['validator'];
    $validator->resolver(function($translator, $data, $rules, $messages) {
         return new 〇〇Validator($translator, $data, $rules, $messages);
    });

}
```

バリデータが　$this->app['validator']に保管されている
resolverというメソッドは　リゾルブというバリデーションの処理を行う。
Validatorのインスタンスをリターンしてこのクラスのバリデーション処理を行う
これでルールが完成されたので
実際に設置してみる

```php
class 〇〇Request extends FormRequest
{
   public function authorize()
   {
       if ($this->path() ==  '〇〇')
       {
           return true;
       } else {
           return false;
       }
   }

   public function rules()
   {
       return [
           'name' => 'required',
           'mail' => 'email',
           'age' => 'numeric|〇〇',
       ];
   }

   public function messages()
   {
       return [
           'name.required' => '名前は必ず入力して下さい。',
           'mail.email'  => 'メールアドレスが必要です。',
           'age.numeric' => '年齢を整数で記入下さい。',
           'age.〇〇' => '入力は偶数のみ受け付けます。',
       ];
   }

}
```

ageに「numeric|〇〇」という形でさっき作ったルールが入っている。
エラーメッセージは　age.〇〇　「入力は偶数のみ受け付けます。」が設定されている。

コントローラーを修正

```php:Controller
class 〇〇Controller extends Controller
{
  
   public function index(Request $request)
   {
       return view('hello.index', ['msg'=>'フォームを入力してください']);
   }

   public function post(〇〇Request $request)
   {
       return view('hello.index', ['msg'=>'正しく入力されました！']);
   }

}

```

これで数値が奇数ならエラー文が吐き出される。