Laravelで業務システム

Laravel関連の記事掲載してます

バリデーションにカスタマイズルールを適用してみる

前回、新規登録画面にバリデーションをつけました。今回はこのバリデーションにカスタマイズルールを加えてみようと思います。

作成するカスタマイズルール


作成するルールは登録する顧客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]

既存ルールのようにカスタマイズルールクラスのインスタンスを指定します。

注意が必要なのは、既存ルールの場合は配列でなくバリデーションルールを"|"で区切られた形で指定できるのですが、カスタマイズルールクラスのインスタンスは配列でないとエラーになります。最初、少しはまってしましました・・。

以上で実装完了です。

まとめ


カスタマイズルールも比較的容易に実装できました。また、ロジックも汚さず実装できますので、非常にいいですね。