バリデーションで特定フィールドが入力された場合に 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()
でカスタムバリデートを呼び出すとか)ですかね。
実は結構利用頻度が高いのでは?と勝手に思っています。