簡體   English   中英

Zend Framework 2,在InputFilter中驗證后過濾值

[英]Zend Framework 2, filter a value after validation in an InputFilter

在InputFilter中,我有以下代碼:

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

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

問題在於,過濾器將在驗證之前應用於該值,因此驗證器始終返回true。

我想知道驗證后是否有任何方法可以進行過濾。

Zend\\InputFilter\\FileInput類是在過濾之前進行驗證的輸入類型之一。 您可以在源代碼中看到他們如何解決它,並基於該解決方案創建自己的PasswordInput類。

正如您在第64行的源代碼中看到那樣,只要isValidfalse (初始值),就會有一個if子句阻止過濾器運行。 因此,驗證程序首先運行,然后在驗證后父InputFilter再次調用getValueFileInput獲取值時,它將運行過濾器。

在驗證之后進行過濾似乎很奇怪,因為驗證之前的輸入可以由過濾器進行編輯。 像條形標簽或修剪字符串。 如果您確實使用了\\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"

注意,開始值與結果不同。 但是您可以在驗證后進行過濾,但是我想您必須自己進行過濾。 因此,您可以在輸入過濾器或表單中添加一個在驗證后調用的方法。 例如:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM