【问题标题】:Why can't I override the default validation error message?为什么我不能覆盖默认验证错误消息?
【发布时间】:2009-06-18 15:34:18
【问题描述】:

我正在使用Zend_Validate 来验证某些表单输入(Zend Framework 版本是 1.8.2)。由于某种原因,使用Zend_Filter_Input 描述的Zend_Filter_Input 接口不起作用:

$data = $_POST;
$filters = array('*' => array('StringTrim'));
$validators = array('driverName' => array('NotEmpty','messages' => 'This should override the default message but does not!'));
$inputFilter = new Zend_Filter_Input($filters,$validators,$data);
$messages = $inputFilter->getMessages();
debug($messages); //show me the variable contents

debug($messages) 的输出:

Array
(
    [driverName] => Array
        (
            [isEmpty] => You must give a non-empty value for field 'driverName'
        )

)

无论我做什么,我都无法覆盖该消息。如果我直接使用验证器,即:

$notEmpty = new Zend_Validate_NotEmpty();      
$notEmpty->setMessage('This WILL override the default validation error message');
if (!$notEmpty->isValid($_POST['driverName'])) {
    $messages = $notEmpty->getMessages();
    debug($messages);
}

debug($messages) 的输出:

Array
(
    [isEmpty] => Please enter your name
)

底线。我可以让验证器工作,但如果没有 Zend_Filter_Input 接口验证方法的好处,我还不如编写自己的验证类!

有没有人知道为什么会发生这种情况以及如何解决?

这可能是一个错误吗?

【问题讨论】:

    标签: php zend-framework validation


    【解决方案1】:

    验证器数组中的messages 键必须传递一个键/值对数组,其中键是验证消息常量,值是您的自定义错误消息。这是一个例子:

        $validators = array(
    
            'excerpt' => array(
                'allowEmpty' => true,
                array('StringLength', 0, Ctrl::getOption('blog/excerpt/length')), 
                'messages' => array(Zend_Validate_StringLength::TOO_LONG => 'The post excerpt must not exceed '.Ctrl::getOption('blog/excerpt/length').' characters.')
            ),
    
        );
    

    但是,在您的情况下,您收到的错误消息来自 Zend_Filter_Input 的 allowEmpty 元命令。这不是一个真正的标准验证器。你可以这样设置:

    $options = array(
        'notEmptyMessage' => "A non-empty value is required for field '%field%'"
    );
    
    $input = new Zend_Filter_Input($filters, $validators, $data, $options);
    
    // alternative method:
    
    $input = new Zend_Filter_Input($filters, $validators, $data);
    $input->setOptions($options);
    

    如果您需要每个字段不同的非空消息,我建议设置 allowEmpty => true 并添加带有自定义消息的 NotEmpty 验证器。

    供您参考,NotEmpty 验证器的正确消息密钥是 Zend_Validate_NotEmpty::IS_EMPTY

    【讨论】:

    • @Jason - 感谢您提供详细信息和正确答案。 $options 参数把它钉牢了。完美,再次感谢:)
    【解决方案2】:

    MESSAGES 参数接受一个数组,而不是字符串。试试这个:

    $validators = array('driverName' => 
                         array('NotEmpty',
                               'messages' => array(
                                    0 => 'This should override the default message but does not!'
                                )
                         )
                  );
    

    【讨论】:

    • @Steve - 我已经试过了,手册会让你相信它有效,但实际上它没有,但感谢您的回答:)
    • @Karim - 太糟糕了 - 它曾经在 ZF 1.0 中以这种方式工作,并且接受验证常量作为消息覆盖数组中的键。我喜欢 ZF 如何提供基于索引的快捷方式,但我想他们真的想让一切都基于明确/约定。
    【解决方案3】:

    这是一个错误,它在 Zend Framework 的 JIRA 中......

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 2014-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 2017-03-16
      相关资源
      最近更新 更多