Zend Framework 2,在InputFilter中验证后过滤值

时间:2014-04-16 15:12:20

标签: zend-framework2 zend-filter zend-inputfilter

在InputFilter中我有这段代码:

    $password = new Input('password');
    $password->setRequired(false)
             ->getValidatorChain()
             ->attach(new Validator\StringLength(6));

    $password->getFilterChain()
             ->attach($this->passwordHash);

问题是过滤器正在应用验证之前的值,因此验证器始终返回true。

我想知道验证后是否有办法进行过滤。

2 个答案:

答案 0 :(得分:1)

Zend\InputFilter\FileInput类是执行validation before filtering的输入类型之一。您可以在源代码中看到他们如何解决它,并根据该解决方案创建自己的PasswordInput类。

正如您所看到的in the source code on line 64,只要isValidfalse(初始值),就会有一个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);
    }
}