0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

バリデーションのカスタマイズ#3

Posted at

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

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

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

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

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

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

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

Controller
public function post(Request $request)
{
    $rules = [
         'name' => 'required',
         'mail' => 'email',
         'age' => 'numeric',
    ];
    $message = [
         'name.required' => '名前が入力されていません',
         'mail.email' => 'メールアドレスが必要です',
         'age.numeric' => '年齢は整数で入力してください',
         'age.min' => '年齢は0歳以上で入力してください',
         'age.max' => '年齢は150歳以下で入力してください',
    ];
    $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'=>'正しく入力されました']);
}

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

use Illuminate\Validation\Validator;

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

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

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

実際に使ってみる
コマンドとかで作ったりできないので
手作業。
Http/Validators/〇〇Validator.php
フォルダ(Validators)とファイル(Validator.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メソッド」を書き換え

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のインスタンスをリターンしてこのクラスのバリデーション処理を行う
これでルールが完成されたので
実際に設置してみる

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.〇〇 「入力は偶数のみ受け付けます。」が設定されている。

コントローラーを修正

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'=>'正しく入力されました!']);
   }

}

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?