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 键来定义何时应用验证规则。如果未定义,则将始终应用该规则。其他有效值是创建和更新。使用这些值之一将使规则仅适用于创建或更新操作。

此外,您可以提供一个可调用函数来确定是否应应用特定规则:

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

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

或者,您甚至可以在表格的beforeMarshal()回调中验证纯表单数据之前对其进行操作,并根据需要更改表单数据或加载另一个验证器或修改验证器。

于 2015-09-22T13:47:14.093 回答