例えば、複数フィールドで、どちらかが必須で、一方の入力があれば、必須でなくしたい場合などがあります。
ま、JSとかやり方はいろいろあると思いますが、Cakephp4でのバリデートで特定の条件のみAllowEmptyを有効にするというような方法です。
$validator ->allowEmptyString('url', 'いずれか必須項目です。', function ($context) { // title/nameフィールドがあると仮定 return !empty($context['data']['title']) || !empty($context['data']['name']); }) ->add('url', 'validateUrl', [ 'rule' => [$this, 'validateUrl'], 'message' => '正しいURLではありません。', ]) ->add('url', 'validateExistsUrl', [ 'rule' => [$this, 'validateExistsUrl'], 'message' => '該当のURLは存在しません。', ]); public function vaildateUrl() { // 検証ロジック略 } public function validateExistsUrl() { // 検証ロジック略 }
上記の例でいうと、デフォルトのallowEmpty()
が有効になっていると、下記検証はスルーされます。
ですが、何でもスルーしたいわけではなく、特定のフィールドが入力された場合のみ検証をスルーしたい。そういった場合は、コールバックを実装し、特定フィールドの値があるときは、allowEmpty()を有効にして、検証しないでOKという形にします。
逆の説明をすると、コンテキストで指定しているフィールドの入力値が空だった場合、allowEmptyにはならない(必須入力になる)ので、各検証が走る仕組みになっています。
補足
厳密にはCakephp4でallowEmpty()
は非推奨な書き方です。(わかりやすく説明するまでに略した・・)
現行のCakephp4はallowEmptyString()
など、型を含めた書き方になります。