在InputFilter中我有这段代码:
$password = new Input('password');
$password->setRequired(false)
->getValidatorChain()
->attach(new Validator\StringLength(6));
$password->getFilterChain()
->attach($this->passwordHash);
问题是过滤器正在应用验证之前的值,因此验证器始终返回true。
我想知道验证后是否有办法进行过滤。
答案 0 :(得分:1)
Zend\InputFilter\FileInput
类是执行validation before filtering的输入类型之一。您可以在源代码中看到他们如何解决它,并根据该解决方案创建自己的PasswordInput
类。
正如您所看到的in the source code on line 64,只要isValid
为false
(初始值),就会有一个if子句阻止过滤器运行。因此,验证程序首先运行,然后验证后的父InputFilter
再次调用getValue
以从FileInput
获取值,它会运行过滤器。
答案 1 :(得分:-1)
验证后过滤似乎很奇怪,因为过滤器可以编辑验证前的输入。像条带标签或修剪字符串。如果你使用像\Zend\I18n\Filter\Alnum()
这样的过滤器,你可以让它删除空格。因此,在验证输入后过滤是不好的做法。
,例如,采取那些过滤器:
// Default settings, deny whitespace
$filter = new \Zend\I18n\Filter\Alnum();
echo $filter->filter("This is (my) content: 123");
// Returns "Thisismycontent123"
// First param in constructor is $allowWhiteSpace
$filter = new \Zend\I18n\Filter\Alnum(true);
echo $filter->filter("This is (my) content: 123");
// Returns "This is my content 123"
请注意,begin值与结果不同。但是您可以在验证后进行过滤,但我想您必须自己完成。因此,您可以向验证后调用的inputfilter或表单添加方法。例如:
public function filterPassword() {
$filter = new \Zend\I18n\Filter\Alnum(true);
$inputs = $this->getInputs();
$password = $filter->filter($inputs['password']);
return $password;
}
在您的控制器中,您可以执行此操作,例如:
public function ExampleController extends AbstractActionController
{
public function sampleAction() {
$form = new LoginForm();
if($form->isValid()) {
$inputFilter = $form->getInputFilter();
$filterdPassword = $inputFilter->filterPassword();
}
return array('form' => $form);
}
}