为什么我不能覆盖默认验证错误消息?

时间:2009-06-18 15:34:19

标签: php zend-framework validation

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

$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接口验证方法的好处,我也可以编写自己的验证类!

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

这可能是个错误吗?

3 个答案:

答案 0 :(得分:5)

验证程序数组中的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

答案 1 :(得分:1)

MESSAGES参数采用数组,而不是字符串。试试这个:

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

答案 2 :(得分:0)

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