Cakephp プログラミング

[Cakephp4]allowEmpty系を特定の条件のみ有効にする

例えば、複数フィールドで、どちらかが必須で、一方の入力があれば、必須でなくしたい場合などがあります。

ま、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()など、型を含めた書き方になります。

 

-Cakephp, プログラミング
-