Zend framework2 Zend Framework 2,在InputFilter中验证后筛选值

Zend framework2 Zend Framework 2,在InputFilter中验证后筛选值,zend-framework2,zend-filter,zend-inputfilter,Zend Framework2,Zend Filter,Zend Inputfilter,在InputFilter中,我有以下代码: $password = new Input('password'); $password->setRequired(false) ->getValidatorChain() ->attach(new Validator\StringLength(6)); $password->getFilterChain() ->att

在InputFilter中,我有以下代码:

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

    $password->getFilterChain()
             ->attach($this->passwordHash);
问题是过滤器在验证之前应用于值,因此验证程序总是返回true


我想知道是否有任何方法可以在验证后进行过滤。

在验证后进行过滤似乎很奇怪,因为验证前的输入可以由过滤器编辑。比如剥去标签或者修剪绳子。如果您确实使用像
\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"
请注意,“开始”值与结果不同。但你可以在验证后过滤,但我想你必须自己过滤。因此,您可以向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);
    }
}
在控制器中,您可以执行以下操作,例如:

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);
    }
}

Zend\InputFilter\FileInput
类是执行此操作的输入类型之一。您可以看到他们是如何在源代码中解决这个问题的,并基于该解决方案创建自己的
PasswordInput


正如您所看到的,只要
isValid
false
(初始值),if子句就会阻止过滤器运行。因此,验证程序首先运行,然后当验证后的父级
InputFilter
再次调用
getValue
FileInput
获取值时,它运行过滤器。

如果需要过滤器将文件上载到云,但所有验证都必须在之前执行,该怎么办?@AlexeyKosov,在保存任何数据(无论是模型还是上传数据)之前,都应执行筛选和验证。我不知道你说的“上传需要过滤器”是什么意思。你能进一步解释一下吗?据我所知,你不使用过滤器上传,而只是修改文件名或en-或解密。PS:OP正在寻求一种在验证后进行过滤的方法,我为他提供了一种方法,所以我不明白为什么你的评论与此相关。另一个答案是关于
fileInputs
,我对此没有回应。