
バリデーションで特定フィールドが入力された場合に allowEmptyString() を有効にしつつ、そうでない場合は allowEmptyString() を無効にさせ(入力必須になる)、後続の検証を走らせる方法です。
この方法はセットで入力フィールドを必須にしたい場合、または、特定の条件によって入力をスルーさせる時に重宝するテクニックです。
Cakephp4: バリデーション
下記は、「全ての入力がある場合は検証を走らせる」 or 「全ての入力がない場合はスルーさせる」というパターンです。
use Cake\Validation\Validator;
/**
* デフォルトバリデーション
*
* @param \Cake\Validation\Validator $validator A Validator instance
* @return \Cake\Validation\Validator
*/
public function validationDefault(Validator $validator): Validator
{
$validator
->allowEmptyString('start_date', '開始・終了日とメッセージは全て入力してください', [$this, 'validatePattern']);
// 後続検証コードなど
$validator
->allowEmptyString('end_date', $message, [$this, 'validatePattern']);
$validator
->allowEmptyString('description', $message, [$this, 'validatePattern']);
return $validator;
}
/**
* 全て入力がある時 | 全て入力がない時 true それ以外は false
*
* allowEmptyStringのコールバックとして検証させる
*
* @param array $context リクエスト含むデータ群
* @return bool
*/
public function validatePattern($context): bool
{
if (
!empty($context['data']['start_date']) && !empty($context['data']['end_date']) && !empty($context['data']['description'])
|| empty($context['data']['start_date']) && empty($context['data']['end_date']) && empty($context['data']['description'])
) {
return true;
}
return false;
}
肝は allowEmptyString() の第3引数に validatePattern() を呼び出している箇所です。
validatePattern() メソッドを1つにまとめておくことで、全てのフィールドに簡単に有効にできます。
allowEmptyString() にコールバックが利用できるのは見落としやすい点(よくあるのは add() でカスタムバリデートを呼び出すとか)ですかね。
実は結構利用頻度が高いのでは?と勝手に思っています。