我有一个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
为空时我根本没有出错。
我做错了什么,或者只是我不了解验证的工作原理?
答案 0 :(得分:2)
让我read the book为你:
条件验证
定义验证规则时,可以使用on键定义何时 应该应用验证规则。如果未定义,规则将 总是应用。其他有效值是创建和更新。用一个 这些值将使规则仅适用于创建或更新 操作
此外,您还可以提供可确定的可调用函数 是否应适用特定规则:
'on' => function ($context) {
// Do your "other data" checks here
return !empty($context['data']['other_data']);
}
因此,只需根据您的"其他数据定义条件"在回调中仅在条件为真时应用规则。
或者,即使在表的beforeMarshal()回调中验证之前,您也可以操作普通表单数据,并根据需要更改表单数据或加载另一个验证程序或修改验证程序。