我如何通过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; }
以下为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
上自己的验证,并避免呼叫setRequired
和setAllowEmpty
。 这将基本上告诉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() {}
}
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;
}
// ...
}
这引发了我的验证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
允许它再由下面的验证进行评估。
我经常看到制作使用错误的人allowEmpty
在输入过滤器配置阵列。 该字符串应该用下划线分离不是骆驼情况下写的。 所以allow_empty
将工作:
'fieldName' => array(
'name' => 'fieldName',
'required' => true,
'allow_empty' => true,
'filters' => array(
//... your filters ...
)
'validators' => array(
//... your validators ...
),
);
这意味着一个场与键“fieldName的”必须是存在于数据中,但其值被允许为空。
如果你喜欢使用一个单独的形式验证类或验证一个数组符号,你可以做如下:
$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 => false
和allowEmpty => true
要输入滤波器工厂(我记得你可以直接通过它来输入滤波器太-不那么肯定)。