我有一个表单 Register
,它有一个字段集 Profile
,它又有一个字段集 Account
。字段集实现了 InputFilterProviderInterface
,因此实现了 getInputFilterSpecification
方法。这是我添加了通用验证器和过滤器的地方,只要使用字段集就应该使用它们。
现在,在我的注册表中,我想验证具有给定用户名的帐户是否不存在。因此,我需要添加一个验证器来补充在 Account
字段集中定义的验证器。这就是我遇到麻烦的地方。经过一番挖掘,我发现了一个 way to add input filters to fieldsets .这样,我想,我可以向我的 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
在不同的上下文(=表单)中经常有不同的“验证要求”。但也许这更多是个人喜好。
关于php - 将输入过滤器添加到 ZF2 中的字段集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23201577/