【问题标题】:cakephp3 custom validationcakephp3 自定义验证
【发布时间】:2015-09-22 12:27:34
【问题描述】:

我有一个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 为空时,我根本不会收到错误消息。

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

【问题讨论】:

    标签: php cakephp cakephp-3.1


    【解决方案1】:

    让我为你read the book

    条件验证

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

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

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

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

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

    【讨论】:

    • 好的,非常感谢:我设法让它工作了。但是还有一些我不明白的东西:我认为在 AND 中处理的规则。这样只有当所有条件都为真时才不会产生错误。在我看来,如果我设置 allowEmpty 和第二条规则,则只有在第二条规则适用时,该字段才能为空。相反,如果该字段为空,则甚至不会评估其他规则。你能解释一下这是如何工作的吗?
    • book.cakephp.org/3.0/en/core-libraries/… "当字段有多个规则时,即使前一个规则失败,每个验证规则也会运行。这允许您在单个规则中收集尽可能多的验证错误通过。但是,如果您想在特定规则失败后停止执行,您可以将最后一个选项设置为 true:" 这样回答了吗?
    • 对我有耐心,但我仍然不明白为什么当我设置 allowEmpty 并传递一个空值时,我的自定义规则根本没有被评估
    • 因为该字段为空,允许为空?
    • 如果是这样的话,好的。但这对我来说似乎仍然违反直觉。我认为该领域必须通过所有规则。这样,在检查该字段是否为空后,验证过程就会停止。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多