バリデーションの話です。バリデーションのルールには、implicitルールというのがあり、入力値の項目が存在しない、あるいは値が空のときに、実行されるルールです。
ルールと言えば、numeric
とかのように値があってのexplicitのルールが直感的ですが、値がないときのルールとは何でしょう?
ぱっと思いつかないかもしれませんが、頻繁に使うrequired
は、値がないときのimplicitルールです。必須なのだから、値がなくてもバリデーションを実行しなければなりません。
Implicitルールが必要なケースは意外にもあります。例えば、以下の管理画面における会員編集の画面。
ここでは、有効のチェックボックスがオン(有効)ですが、これをオフ(無効とする)として投稿するとチェックボックスの入力値はありません。しかし、例えば、会員を無効にするには、未支払いの注文があってはいけない、というルールがあるとすると、これはimplicitルールを作成しないとそのルールを強制することはできません。
このカスタムルールを作成してみましょう。
$ php artisan make:rule MemberDeactivateRule
作成されたファイルを編集します。
namespace App\Rules; use App\Models\Member; use Illuminate\Contracts\Validation\ImplicitRule; class MemberDeactivateRule implements ImplicitRule { protected $member; /** * Create a new rule instance. * @param \App\Models\Member $member * @return void */ public function __construct(Member $member) { $this->member = $member; } /** * Determine if the validation rule passes. * * @param string $attribute * @param mixed $value * @return bool */ public function passes($attribute, $value) { // チェックボックスをオンとすると、'Y'を返すとする。 if ($value == 'Y') { return true; } // チェックボックスがオフなら、 // 未払いの注文があるかどうかをチェックして、エラーとする if ($member->checkUnpaid()) { return false; } return true; } /** * Get the validation error message. * * @return string */ public function message() { return '未払いの注文があります'; } }
通常のカスタムルールと違うのは、カスタムルールのクラスの実装にImplicitRule
のインターフェースを使用していることです、通常は、ImplicitRule
の代わりにRule
のクラスを使用します。
最後に、コントローラで、このカスタムルールを使用したバリデーションは、以下のようになります。
... $request->validate(['active_flag' => new MemberDeactivateRule($member)]);メルマガ購読の申し込みはこちらから。