ZF2 - NotEmpty 验证器的不同错误消息

ZF2 - different error messages with NotEmpty validator

我在 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" 元素的表单时,消息仍然是 "Value is required and can't be empty"!为什么?

在这两种情况下我都需要相同的消息,因为有时表单不会包含 "name" 元素。

非常感谢你们!

感谢您回复评论以澄清问题。首先我必须说,我感觉到你对这个的痛苦。在一年多没有使用 ZF2 并花了一些时间弄清楚这一点之后,它突出了 ZF2 中的另一个痛苦之处。

也就是说,这是我的简单解决方案。不一定正确,也不是最好的解决方法,但它可以用最少的代码解决您的问题。 在您实例化和验证表单的控制器中,在调用 new Form:

之前添加此代码
if (!isset($_POST['name'])) {
    $this->getRequest()
         ->setPost(
             new \Zend\Stdlib\Parameters(
                 array('name' => '')
             )
         );
}

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

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

发生这种情况是因为 \Zend\InputFilter\Input 的工作方式。当 InputFilter 运行时,它发现元素 missing。然后它检查 required 属性,发现它是真的,但输入 没有值 。没有值不同于 empty.

当需要过滤器但没有输入时,调用\Zend\InputFilter\Input::prepareRequiredValidationFailureMessage。如果查看该函数的源代码,您会看到:

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

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

备选方案:

一个替代方案可能更正确,但也需要更多代码,并且可能会更令人困惑,稍后回头看是创建一个新的 class 实现 \Zend\Validator\Translator\TranslatorInterface 并设置一个数组该消息的翻译,然后调用 \Zend\Validator\AbstractValidator::setDefaultTranslator 传递它,以便默认翻译器将用于该消息。

这很困难,因为 classes 是如何继承的,所以没有设置该对象的捷径,而且我无法找到一个快速的解决方案来设置默认转换器只是那个消息。另外,如果你有另一个翻译器,它可能会干扰它。

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

希望对您有所帮助!

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

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

    return parent::setData($data);
}