cakephp3自定义验证

时间:2015-09-22 12:27:35

标签: php cakephp cakephp-3.1

我有一个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字段设置值时,出现'duration is not OK'错误(如预期的那样)。但是,当我将值设为空时,我会收到'This field cannot be left empty'错误。

所以我补充道:

->allowEmpty('duration');

但是在这种情况下duration为空时我根本没有出错。

我做错了什么,或者只是我不了解验证的工作原理?

1 个答案:

答案 0 :(得分:2)

让我read the book为你:

  

条件验证

     

定义验证规则时,可以使用on键定义何时   应该应用验证规则。如果未定义,规则将   总是应用。其他有效值是创建和更新。用一个   这些值将使规则仅适用于创建或更新   操作

     

此外,您还可以提供可确定的可调用函数   是否应适用特定规则:

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

因此,只需根据您的"其他数据定义条件"在回调中仅在条件为真时应用规则。

或者,即使在表的beforeMarshal()回调中验证之前,您也可以操作普通表单数据,并根据需要更改表单数据或加载另一个验证程序或修改验证程序。