使用Phalcon进行条件验证


Conditional validation with Phalcon

有任何方法可以使用Phalcon的验证功能:

$validation->add('telephone', new PresenceOf( [
    'message'       => 'The telephone is required',
    'onFail'        => //Validate this,
    'onSuccess'     => //Validate that
]));

编辑:

好吧,我要求这样做是因为我有一些验证应该只在2或3个条件以任意顺序匹配时才运行,所以cancelOnFail属性在这里没有多大帮助。

也许如果我创建一个自定义验证组,如$validation->add('stuff', new ComplexValidation()),但顺序仍然是一个问题。这个验证系统的工作方式是线性的。考虑到这些因素,我如何用Phalcon实现更复杂的验证?

是。费尔康有一个类似的验证系统。以下代码将用于确保提供'telephone'字段:

$this->validate(new PresenceOf(
    array(
            "field"   => "telephone",
            "message" => "The telephone is required"
         )
));

这个验证器在validation()函数中对模型调用。根据文档,PresenceOf验证器被自动添加到模型表中标记为"非空"的字段。如果我理解正确,你实际上不需要插入这段代码,如果你的字段是'非空',虽然你可以这样做,如果你想覆盖默认的'验证失败'消息为这个特定的表单。您可以通过覆盖模型中的getMessages()函数来修改默认的验证消息(并提供翻译)。这里有关于费尔康验证信息系统的更多信息。

失败消息与来自其他字段验证(例如Uniqueness)的其他消息聚合在一起。对于每个失败的验证,您可以访问消息、字段、类型(和原始模型)。对于每个失败的验证,下面的代码将输出消息中包含的所有信息:

if ($form->save() == false) {
    foreach ($form->getMessages() as $message) {
        echo "Message: ", $message->getMessage();
        echo "Field: ", $message->getField();
        echo "Type: ", $message->getType();            
        echo "Model: ", $message->getModel();
    }
}

我注意到两种不同的方法来通知用户验证消息:放在表单前面(如图所示)或放在表单输入本身附近。如果您想输出接近输入的消息,您可能需要遍历每个消息(来自getMessages())并检查与您的输入匹配的字段名称,然后使用getMessage()回送消息。

我自己是Phalcon的新手,所以我还没有探索验证器的所有功能。有一个事件系统,您可以使用它来插入代码beforeValidationafterValidation。这可能是寻找输出成功验证消息的一个地方。