ZF2 - 使用NotEmpty验证程序的不同错误消息

时间:2015-11-27 21:43:13

标签: php zend-framework

我在Zend Framework 2中遇到了这个愚蠢的错误消息。花了两​​个小时而没有,我仍然使用NotEmpty验证器获得两个不同的错误消息。

$nameNotEmptyMessage = 'Pole wymagane';

$inputFilter->add(array(
     'name' => 'name',
     'required' => true,
     'filters' => array(
          new Filter\StringTrim()
     ),
     'validators' => array(
         new Validator\NotEmpty(array(
             'messages' => array(
                 Validator\NotEmpty::INVALID => $nameNotEmptyMessage,
                 Validator\NotEmpty::IS_EMPTY => $nameNotEmptyMessage
             )
         ))
     )
));

什么?当我用" name"发送表单时,它的工作非常酷。里面的元素。当它空了,我收到了我的信息。但是,当我发送没有"名称"在其中的元素,消息仍然是"值是必需的,并且不能为空"!为什么呢?

我需要在两种情况下都有相同的信息,因为有时表格不会有" name"元件。

非常感谢你们!

2 个答案:

答案 0 :(得分:1)

感谢您回复评论以澄清问题。首先我必须说,我觉得你对这个感到痛苦。在没有使用ZF2超过一年并花费一些时间来解决这个问题之后,它突显了ZF2中的另一个痛苦的事情。

那就是说,这是我的简单解决方案。没有必要正确,或者最好的方法,但它用最少的代码解决了你的问题。 在您实例化并验证表单的控制器中,在致电new Form之前添加此代码

if (!isset($_POST['name'])) {
    $this->getRequest()
         ->setPost(
             new \Zend\Stdlib\Parameters(
                 array('name' => '')
             )
         );
}

这似乎是最简单的路线,而不是设置默认验证转换器并添加重复消息。只是检查name字段是否不存在,如果是,则将其设置为任何空值。

现在我们必须这样做的原因:

这是因为\Zend\InputFilter\Input的工作原理。当InputFilter运行时,它会看到元素缺少。然后它检查required属性,看到它是真的,但输入没有值。没有值与不同。

当需要过滤但没有输入时,会调用\Zend\InputFilter\Input::prepareRequiredValidationFailureMessage。如果你看一下该函数的来源,你会看到:

protected function prepareRequiredValidationFailureMessage()
{
    $notEmpty = new NotEmpty();
    $templates = $notEmpty->getOption('messageTemplates');
    return [
        NotEmpty::IS_EMPTY => $templates[NotEmpty::IS_EMPTY],
    ];
}

注意它如何创建新的NotEmpty验证器并获取其默认消息,从而绕过您在InputFilter中设置的转换。

替代方案:

一种替代方案,可能更正确,但也需要更多代码,并且可能更容易让人感到困惑,以后再回过头来创建一个实现\Zend\Validator\Translator\TranslatorInterface的新类,并设置一个包含该消息的翻译的数组,然后调用\Zend\Validator\AbstractValidator::setDefaultTranslator传递,以便在该消息上使用默认翻译器。

这很难,因为没有简短的方法来设置该对象,因为这些类是如何继承的,而且我无法找到一个快速解决方案来设置只有该消息的默认翻译器。此外,如果你有另一个翻译,它可能会干扰它。

所以看起来最简单的事情就是检查该表单字段是否缺失,如果缺少任何空值,则将其填充。

希望有所帮助!

答案 1 :(得分:0)

其他更简单的解决方法是覆盖Form setData($ data)并检查是否设置了$ data ['name']。像这样:

public function setData($data)
{
    if(!isset($data['name'])){
        $data['name'] = '';
    }

    return parent::setData($data);
}