传递给Zend框架2验证器的空值

dey*_*ine 13 php validation zend-framework2 input-filter

如何通过Zend框架2 ValidatorChain将空值传递给我的自定义验证器?

在ZF1上有可能 allowEmpty(false)

在具有空元素值的ZF2上:

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

  • 如果allowEmpty = true,Element被视为有效,@see Zend/InputFilter/BaseInputFilter#isValid

    if ($input->allowEmpty()) {
        $this->validInputs[$name] = $input;
        continue;
    }
    
    Run Code Online (Sandbox Code Playgroud)

ani*_*eni 26

continue_if_empty解决了我的问题.感谢@ dson-horácio-junior.这是我用过的:

$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;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)


Ocr*_*ius 14

以下适用于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
Run Code Online (Sandbox Code Playgroud)

当您遇到特殊情况时,这非常烦人,例如检查分配给CMS中页面的URL并避免冲突(空URL仍然是URL!).

有一种方法可以处理空字符串,这基本上是自己附加NotEmpty验证器,并避免调用setRequiredsetAllowEmpty.这基本上Zend\InputFilter\Input#injectNotEmptyValidator不会告诉您不要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)
Run Code Online (Sandbox Code Playgroud)

如果您还想要检查null,则需要扩展Zend\InputFilter\Input如下:

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

  • 只需要`$ input-> setContinueIfEmpty(true);`而不是扩展_Zend\InputFilter\Input_,它将具有相同的效果,更少的工作和更简单. (5认同)

Ons*_*hop 7

Callback当值为空字符串时,这会触发验证程序的验证:

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

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