[英]Adding input filter to fieldset in ZF2
我有一個表單Register
,它有一個fieldset Profile
,后者又有一個fieldset Account
。 字段集實現InputFilterProviderInterface
,從而實現getInputFilterSpecification
方法。 這是我添加通用驗證器和過濾器的地方,每當使用字段集時都應該使用它們。
現在,在我的注冊表單中,我想驗證具有給定用戶名的帳戶是否尚不存在。 因此,我需要添加一個驗證器來補充在Account
字段集上定義的驗證器。 這是我遇到麻煩的地方。 在挖掘了一下之后,我找到了一種向字段集添加輸入過濾器的方法 。 這樣,我想,我可以在我的Account
字段集中添加一個額外的輸入過濾器。
class Register extends Zend\InputFilter\InputFilter
{
public function __construct()
{
$this->add(new RegisterProfileFilter(), 'profile');
}
}
使用上面的代碼,我可以在我的Profile
字段集中添加一個輸入過濾器,在該輸入過濾器中,我可以對我的account
字段集執行相同的操作。 但是,這種方法看起來有兩個問題:
Profile
字段集創建一個輸入過濾器,以便我可以向Account
字段集添加輸入過濾器 - 即使我不需要在Profile
字段集中添加任何驗證器或任何內容。 如果我嘗試直接將過濾器添加到account
字段集,它不起作用 getInputFilterSpecification
方法中定義的過濾器,而不是像我想要的那樣合並兩者 有沒有辦法合並我的字段集上定義的輸入過濾器規范與一個額外的規范(或Zend\\InputFilter\\InputFilter
實例,這樣我不必將我的字段集規范復制到我的輸入過濾器類?這將是重復的代碼並且不是很難維護。或者我錯過了導致我走錯路的東西?
以下是我的代碼,如果它有任何幫助。
// The code has been altered to be more self-explanatory and shorter
class RegisterForm extends \Zend\Form\Form
{
public function __construct()
{
parent::__construct('register');
// Elements are added here
$profileFieldset = new ProfileFieldset();
$profileFieldset->setUseAsBaseFieldset(true);
$this->add($profileFieldset);
}
}
class ProfileFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('profile');
// Elements are added here
$this->add(new AccountFieldset());
}
public function getInputFilterSpecification()
{
return array(
/***** The below is apparently cleared when adding an input filter to this fieldset *****/
'some_element1' => array(
'required' => false,
),
'some_element2' => array(
'required' => false,
),
);
}
}
class AccountFieldset extends \Zend\Form\Fieldset implements InputFilterProviderInterface
{
public function __construct()
{
parent::__construct('account');
// Elements are added here
}
public function getInputFilterSpecification()
{
return array(
/***** This is the element that I want to add an additional validator to in a specific context (form) *****/
'username' => array(
'required' => true,
'validators' => array(
new Validator\StringLength(array(
'min' => 4,
'max' => 15,
)),
new I18nValidator\Alnum(false),
),
),
// Other elements here
);
}
}
Zend\\Form
組件中沒有很好地涵蓋合並InputFilters。 有人必須真正重構整個事情。
無論如何,什么工作,因此我建議在你的情況下,通過覆蓋表單中的getInputFilter
方法創建整個InputFilter后添加驗證器。
class RegisterForm extends \Zend\Form\Form
{
public function __construct()
{
// add stuff
}
public function getInputFilter()
{
$formInputFilter = parent::getInputFilter();
$usernameInput = $formInputFilter->get('profile')->get('account')->get('username');
$myValidator = new Validator\SomeValidator();
$usernameInput->getValidatorChain()->addValidator($myValidator);
return $formInputFilter;
}
}
作為旁注我建議限定InputFilters
每Form
基礎而不是每個Fieldset
,因為在元件Fieldset
通常具有在不同的上下文(=表)不同“的驗證要求”。 但也許這更像是個人偏好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.