Cakephp PHP WEB開発

【Cakephp4】バリデーション: allowEmptyStringをケースによって有効・無効にする方法

※本サイトはPR表記を含みます。

バリデーションで特定フィールドが入力された場合に 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() でカスタムバリデートを呼び出すとか)ですかね。

実は結構利用頻度が高いのでは?と勝手に思っています。

-Cakephp, PHP, WEB開発
-