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
自動的にアタッチしないように指示します。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() {}
}