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验证器,并避免调用setRequired和setAllowEmpty.这基本上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)
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允许它再由下面的验证进行评估.
| 归档时间: |
|
| 查看次数: |
17091 次 |
| 最近记录: |