1

我只想获取触发消息,但我正在获取所有已注册的消息。

$inputFilter = $factory->createInput(array(
        'name'       => 'image',
        'required'   => true,
        'validators' => array(
            array(
                'name'    => '\Zend\Validator\File\IsImage',
                'options' => ['message' => 'File has to be valid image.']
            ),
            array(
                'name'    => '\Zend\Validator\File\Extension',
                'options' => ['extension' => 'png,jpg,jpeg', 'message' => 'Image extension has to be png,jpg or jpeg.'],
            ),
            array(
                'name'    => '\Zend\Validator\File\Size',
                'options' => ['max' => '2MB', 'message' => 'Maximum file size for image is 2MB.'],
            ),
        ),
    ));

稍后在控制器中:

if(!$filter->isValid()){
    var_dump($filter->getMessages());
}

如果我尝试上传 5MB 大小的图像,我会收到所有消息:

array(
  'image' => array(
    'fileIsImageNotReadable' => 'File has to be valid image'
    'fileExtensionNotFound' => 'Image extension has to be png,jpg or jpeg'
    'fileSizeNotFound' => 'Maximum file size for image is 2MB'  
  )
);

但只期望“图像的最大文件大小为 2MB”。

有没有办法只返回触发消息?这应该是 getMessages() 方法的默认行为吗?

4

1 回答 1

1

一个可能的解决方案是使用Validator Chains

在某些情况下,如果验证过程失败,让验证者中断链是有意义的。Zend\Validator\ValidatorChain使用方法的第二个参数支持此类用例attach()。通过设置$breakChainOnFailureTRUE,添加的验证器将在失败时中断链执行,从而避免运行任何其他被确定为不必要或不适合该情况的验证。

这样,验证会在第一次失败时停止,您只会收到验证失败的消息。您还可以设置优先级,以便以特定顺序应用您的验证器。文档上给出的这个例子使用了方法attach。这不是您所需要的。

在您的情况下,您可以只使用break_chain_on_failure验证器规范中的键并将值设置为 true。像这样的东西:

$inputFilter = $factory->createInput(array(
        'name'       => 'image',
        'required'   => true,
        'validators' => array(
            array(
                'name'    => '\Zend\Validator\File\IsImage',
                'options' => ['message' => 'File has to be valid image.']
                'break_chain_on_failure' => true,
            ),
        ),
));
于 2015-04-27T12:19:06.907 回答