バリデーションにカスタマイズルールを適用してみる
前回、新規登録画面にバリデーションをつけました。今回はこのバリデーションにカスタマイズルールを加えてみようと思います。
作成するカスタマイズルール
作成するルールは登録する顧客IDがすでにDBに存在している場合はエラーメッセージを出すようにするものです。DBを参照してチェックすることも割とあるので、今回はこの辺も勉強したいと思います。
カスタマイズルールファイルを作成する
カスタマイズルールはまずカスタマイズルール記述したルールファイルを作成しそのクラスをリクエストファイルのルールに加えることで実装できます。
ルールファイルは以下のようにArtisanで作成できます。
#php artisan make:rule MstCustomerIdRule
ルールのファイル名は"MstCustomerIdRule"としました。
ルールファイルのpassesとmessage関数を以下のように記述します。
public function passes($attribute, $value) { return Customer::where('customer_id', $value)->doesntExist(); } public function message() { return 'すでにこの顧客IDは登録されております。'; }
基本的にpasses関数の中にバリデーションルールを記載します。この関数でfalseを返せば、ルールに違反したということになります。
重複判定については EloquentのdoesntExistで完結な記述にしてみました。非常に楽ですね。
尚、DBを参照しますので、ルールファイルに以下のようにモデルクラスをインポートしておく必要あります。
use App\Models\Customer;
リクエストファイルとの紐づけ
まずリクエストファイルにルールファイルのクラスをインポートするために以下を記述します。
use App\Rules\MstCustomerIdRule;
次にすでに実装したリクエストファイルのルールを以下のように変更します。
'customer_id' => ['required','min:10','max:10',new MstCustomerIdRule]
既存ルールのようにカスタマイズルールクラスのインスタンスを指定します。
注意が必要なのは、既存ルールの場合は配列でなくバリデーションルールを"|"で区切られた形で指定できるのですが、カスタマイズルールクラスのインスタンスは配列でないとエラーになります。最初、少しはまってしましました・・。
以上で実装完了です。
まとめ
カスタマイズルールも比較的容易に実装できました。また、ロジックも汚さず実装できますので、非常にいいですね。