2

我使用 Zend\InputFilter\InputFilter 类进行表单验证。字段应该只接受 1 到 5 之间的整数。但它不能正常工作,它接受以 1 到 5 之间的整数开头的字符串。例如 1kjhkjh、2tgfjhgfjhf、4jhkljg... 我的代码有什么问题?

$inputFilter->add (
            $inputFilter->getFactory()->createInput (
                array (
                    'name' => 'point',
                    'required' => true,
                    'validators' => array ( 
                        array(
                            'name' => 'Digits'),    
                        array (
                            'name' => 'Between',
                            'options' => array (
                                'min' => 1,
                                'max' => 5,
                                'messages' => array('notBetween' => 'Point must be between %min% and %max%')
                            )
                        )
                    )
                )
            )
        );
4

2 回答 2

3

使用 zend 验证器的第二个参数来中断验证器链并返回错误,breakChainOnFailure文档)告诉元素在触发此错误时停止验证,因此在您的情况下,如果它不是数字,则用户会收到错误,当用户已经修复了第二个验证器也会被触发的错误:

$inputFilter->add (
            $inputFilter->getFactory()->createInput (
                array (
                    'name' => 'point',
                    'required' => true,
                    'validators' => array ( 
                        array(
                            'name' => 'Digits', 'breakChainOnFailure' => true),    
                        array (
                            'name' => 'Between',
                            'options' => array (
                                'min' => 1,
                                'max' => 5,
                                'messages' => array('notBetween' => 'Point must be between %min% and %max%')
                            )
                        )
                    )
                )
            )
        );

另一种选择是替换Zend_Validate_DigitsZend_Validate_Int( docmentation ),具体取决于您在用户输入无效数据时希望向用户提供的错误消息。当然,正如评论中所建议的那样,您也可以使用Zend_Filter_Intif 您想要通过自己修复任何无效数据来处理任何无效数据,并且不要向用户提供有关他做错了什么的反馈。

于 2013-07-23T14:27:16.020 回答
0
'breakChainOnFailure': true

应该

'breakChainOnFailure'=> true
于 2014-02-25T03:02:34.037 回答