
例えば、複数フィールドで、どちらかが必須で、一方の入力があれば、必須でなくしたい場合などがあります。
ま、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()など、型を含めた書き方になります。