2

durationフォームから送信された他のデータに応じて、空になることも空にならないこともあるフィールドがあります。だから私は CakePHP3 でカスタム検証をしようとしています。

私のテーブルで私がした

public function validationDefault(Validator $validator)
{
    $validator
    ->add('duration', 'durationOk', [
        'rule' => 'isDurationOk',
        'message' => 'duration is not OK',
        'provider' => 'table'
    ]);
    return $validator;
}

public function isDurationOk($value, $context)
{
    // do some logic
    return false; // Always return false, just for test
}

期間フィールドの値を設定すると、'duration is not OK'(予想どおり) エラーが発生します。しかし、値を空にすると'This field cannot be left empty'エラーが発生します。

だから私は追加しました:

->allowEmpty('duration');

しかし、この場合、durationが空の場合、エラーはまったく発生しません。

私は何か間違ったことをしていますか、それとも検証の仕組みを理解していないだけですか?

4

1 に答える 1

2

あなたのために本を読ませてください:

条件付き検証

検証ルールを定義する場合、 on キーを使用して、検証ルールをいつ適用するかを定義できます。未定義の場合、ルールは常に適用されます。その他の有効な値は create と update です。これらの値のいずれかを使用すると、ルールは作成操作または更新操作のみに適用されます。

さらに、特定のルールを適用するかどうかを決定する呼び出し可能な関数を提供できます。

'on' => function ($context) {
    // Do your "other data" checks here
    return !empty($context['data']['other_data']);
}

そのため、コールバックで「その他のデータ」に応じて条件を定義し、条件が真の場合にのみルールを適用します。

または、テーブルのbeforeMarshal()コールバックで検証される前であってもプレーン フォーム データを操作し、必要に応じてフォーム データを変更するか、別のバリデータをロードするか、バリデータを変更することができます。

于 2015-09-22T13:47:14.093 に答える