Symfony2验证可选字段

时间:2012-10-30 09:05:25

标签: php forms validation symfony symfony-2.0

在我的表单中,我有一个必填项设置为false的字段,此字段是可选的。

但是,我希望在使用该字段时对此字段进行notBlank验证:

@Assert\NotBlank(
 *     message="The name field can't be blank",
 *     groups={"flow_poemDataCollector_step1"}
 * )

现在,我无法使用验证约束NotBlank,因为当字段未使用时,它会导致我的表单验证失败。

我尝试在onPostBindRequest侦听器中的字段中添加随机值,但它很复杂,并且无法使其工作。我不确定这是不正确的方法。

这是我尝试过的:( $ form是一个Symfony \ Component \ Form \ FormInterface对象)

    $form = $event->getForm();
    $formData = $form->getData();
    $formData->setUserName("foo");
    $form = $form->setData($formData);

然后我收到一个错误,我无法在未绑定的表单上调用isValid()。

我如何实现目标?即。仅在某些情况下验证字段。

5 个答案:

答案 0 :(得分:7)

我能看到实现此目的的最佳方法是在您的实体上使用Callback validator。由于此回调是在您的实体中定义的,因此它可以访问所有属性。通过ExecutionContext,您可以根据需要设置违规。

答案 1 :(得分:6)

这是一个老问题,但似乎现在我们可以这样做:

@Assert\Optional(
    @Assert\NotBlank(
        message="The name field can't be blank",
        groups={"flow_poemDataCollector_step1"}
    )
)

参考:http://symfony.com/doc/2.7/reference/constraints/Collection.html

答案 2 :(得分:0)

嗯。我不得不多次重读您的问题,因为其中的某些内容在逻辑上无效。

如果您不想要该字段,那么使用NotBlank约束是没有意义的。如何在同一时间不需要和要求某个领域?

如果您想要的是,如果在该字段中输入的内容并不仅仅包含空格,那么您根本不需要NotBlank约束,因为Symfony会修改用户输入默认,所以它最终会好像什么都没有输入一样。

答案 3 :(得分:0)

如果您希望该字段是可选字段,您可以:

new Assert\Length(array('min' => 0))

因为从约束中省略字段会导致意外的字段错误。

答案 4 :(得分:0)

最后在这里搜索如何使字段既可选又验证(如果输入),如可选电子邮件:

来自 symfony 文档:

<块引用>

与大多数其他约束一样,空字符串和空字符串是 视为有效值。这是为了让它们成为可选值。 如果该值是强制性的,一个常见的解决方案是结合这个 使用 NotBlank 进行约束。

https://symfony.com/doc/current/reference/constraints/Email.html

所以解决方案只是验证为 Email 并且该字段仍然是可选的。