如何为模型属性的子集创建 \Zend\Form\Form 对象?

How to create a \Zend\Form\Form object for a subset of Model properties?

我有一个模型,其中包含 10 个属性,我为每个属性指定了输入过滤规则。我想创建一个 \Zend\Form\Form 对象,它应该只用于这 10 个字段的一个子集(比如其中的 5 个)。我 运行 遇到的问题是,当我执行 \Zend\Form\Form::bind() 时,所有 10 个字段的输入过滤器规则都被拉入,并且由于表单没有其中的 5 个,验证出现错误(虽然为零错误消息,因为表单没有错误消息)。

我知道有几个选项可以解决这个问题,但我想为模型中的每个字段维护过滤器和验证规则,因此无论表单如何,我都使用相同的过滤和验证规则将自动被采纳。我对 ZF2 还是比较陌生,所以我真的很想问,除了我将在下面列出的选项之外,是否还有其他方法可以做到这一点。

  1. 编写我自己的 \Zend\Form\FormInterface 实现以防止输入过滤器的 "copying"。
  2. 有一个模型只包含此特定表单的字段。
  3. 重新考虑我的数据库设计,以便在我的所有模型和表单之间建立直接的字段到字段关系。

非常感谢!

注意: 我尝试使用表单工厂中的模型对象中的 \Zend\Input\InputFilter::get('FieldNameHere') 仅引入我需要的 InputInterface , 但 \Zend\Form\Form::bind() 只是覆盖它。

您可以使用 validation groups 选择应包含在表单验证中的元素。

来自文档:

Sometimes you want to validate only a subset of form elements. As an example, let’s say we’re re-using our contact form over a web service; in this case, the Csrf, Captcha, and submit button elements are not of interest, and shouldn’t be validated.

Zend\Form provides a proxy method to the underlying InputFilter‘s setValidationGroup() method, allowing us to perform this operation.

$form->setValidationGroup('name', 'email', 'subject', 'message');
$form->setData($data);

if ($form->isValid()) {
    // Contains only the "name", "email", "subject", and "message" values
    $data = $form->getData();
}