[英]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行的源代碼中看到的那樣,只要isValid
為false
(初始值),就會有一個if子句阻止過濾器運行。 因此,驗證程序首先運行,然后在驗證后父InputFilter
再次調用getValue
從FileInput
獲取值時,它將運行過濾器。
在驗證之后進行過濾似乎很奇怪,因為驗證之前的輸入可以由過濾器進行編輯。 像條形標簽或修剪字符串。 如果您確實使用了\\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.