空值传递给Zend框架2个验证(Empty values passed to Zend framew

2019-07-20 01:14发布

我如何通过Zend框架2 ValidatorChain空值到我的自定义的验证?

这对ZF1可能通过allowEmpty(false)

在空元素值ZF2:

  • 如果allowEmpty = false ,NotEmptyValidator添加到ValidatorChain的顶部breakOnFailure = true@see Zend/InputFilter/Input#injectNotEmptyValidator

  • 如果allowEmpty = true ,元素被认为是有效的, @see Zend/InputFilter/BaseInputFilter#isValid

     if ($input->allowEmpty()) { $this->validInputs[$name] = $input; continue; } 

Answer 1:

以下为ZF2版本2.1.1作品:

问题(如果我得到它正确)是,在下面的例子中,为空值'fieldName' ,没有验证被触发。 这可能是很烦人的,但在

$input = new \Zend\InputFilter\Input('fieldName');

$input
    ->setAllowEmpty(true)
    ->setRequired(false)
    ->getValidatorChain()
    ->attach(new \Zend\Validator\Callback(function ($value) {
        echo 'called validator!';

        return true; // valid
    }));

$inputFilter = new \Zend\InputFilter\InputFilter();
$inputFilter->add($input);

$inputFilter->setData(array('fieldName' => 'value'));
var_dump($inputFilter->isValid()); // true, echoes 'called validator!'

$inputFilter->setData(array('fieldName' => ''));
var_dump($inputFilter->isValid()); // true, no output

$inputFilter->setData(array());
var_dump($inputFilter->isValid()); // true, no output

这是很烦人的,当你有特殊情况,如检查您的CMS分配给页面的URL和避免碰撞(空URL仍然是一个URL!)。

有处理这个空字符串,这是从根本上附加的方式NotEmpty上自己的验证,并避免呼叫setRequiredsetAllowEmpty 。 这将基本上告诉Zend\InputFilter\Input#injectNotEmptyValidator不utomatically附加NotEmpty自行验证:

$input = new \Zend\InputFilter\Input('fieldName');

$input
    ->getValidatorChain()
    ->attach(new \Zend\Validator\NotEmpty(\Zend\Validator\NotEmpty::NULL))
    ->attach(new \Zend\Validator\Callback(function ($value) {
        echo 'called validator!';

        return true; // valid
    }));

$inputFilter = new \Zend\InputFilter\InputFilter();
$inputFilter->add($input);

$inputFilter->setData(array('fieldName' => 'value'));
var_dump($inputFilter->isValid()); // true, echoes 'called validator!'

$inputFilter->setData(array('fieldName' => ''));
var_dump($inputFilter->isValid()); // true, echoes 'called validator!'

$inputFilter->setData(array());
var_dump($inputFilter->isValid()); // false (null was passed to the validator)

如果你也想核对null ,则需要延长Zend\InputFilter\Input如下:

class MyInput extends \Zend\InputFilter\Input
{
    // disabling auto-injection of the `NotEmpty` validator
    protected function injectNotEmptyValidator() {}
}


Answer 2:

continue_if_empty解决我的问题。 感谢@ DSON-奥拉西奥 - 初中。 这是我用什么:

$this->add(array(
    'name' => 'field',
    'continue_if_empty' => true,
    'filters' => array(
        array('name' => 'StripTags'),
        array('name' => 'StringTrim')
    ),
    'validators' => array(
        array(
            'name' => 'Application\Form\Validator\Sample'
        )
    )
));

public function isValid($value, $context = null)
{
    if ($value == '' && $context['otherfield'] == '') {
        $this->error(self::INVALID_FIELD);

        return false;
    }

    // ...
}


Answer 3:

这引发了我的验证Callback验证当数值是空字符串:

'required'          => false,
'allow_empty'       => false,
'continue_if_empty' => true,
'validators'        => array(
    array(
        'name'    => 'Callback',
        'options' => array(
            'callback' => function ($value, $context = []) use ($self) {
                // ...
            }
        )
    )
)

allow_empty最初无效空字符串和continue_if_empty允许它再由下面的验证进行评估。



Answer 4:

我经常看到制作使用错误的人allowEmpty在输入过滤器配置阵列。 该字符串应该用下划线分离不是骆驼情况下写的。 所以allow_empty将工作:

'fieldName' => array(
    'name'        => 'fieldName',
    'required'    => true,
    'allow_empty' => true,
    'filters' => array(
        //... your filters ...
    )
    'validators' => array(
        //... your validators ...
    ),
);

这意味着一个场与键“fieldName的”必须是存在于数据中,但其值被允许为空。



Answer 5:

如果你喜欢使用一个单独的形式验证类或验证一个数组符号,你可以做如下:

$factory     = new Zend\InputFilter\Factory();
$inputFilter = new Zend\InputFilter\InputFilter();

$inputFilter->add($factory->createInput(array(
    'name' => 'name',
    'required' => false,
    'allowEmpty' => true,
    'filters' => array(
        array('name' => 'StripTags'),
        array('name' => 'StringTrim'),
    ),
    'validators' => array(
        array(
            'name' => 'StringLength',
            'options' => array(
                'encoding' => 'UTF-8',
                'min' => '8',
                'max' => '100',
            ),
        ),
    ),
)));

你可以传递一个阵列required => falseallowEmpty => true要输入滤波器工厂(我记得你可以直接通过它来输入滤波器太-不那么肯定)。



文章来源: Empty values passed to Zend framework 2 validators