Symfony FormType 至少选择了一个收音机

Symfony FormType at least one radio selected

我正在使用 Symfony 3.4,我有一个带有多个字段和 2 个布尔值的 FormType,例如:

           ->add("is_my_first_boolean", ChoiceType::class, array(
                "expanded" => true,
                "multiple" => false,
                "choices" => array(
                    'Yes' => "1",
                    'No' => "0"
                )
            ))
            ->add("is_my_second_boolean", ChoiceType::class, array(
                "expanded" => true,
                "multiple" => false,
                "choices" => array(
                    'Yes' => "1",
                    'No' => "0"
                )
            ))

所以用户可以在我的表单上 select 2 个布尔值 Yes/No,而我需要的是验证(PHP 在后端而不是在前端进行验证),例如这两个布尔值中至少有一个是 selected.

所以如果两者都设置为NO,就会出现错误'You must choose at least first_boolean or second_boolean"

最好的方法是什么?

谢谢!

好吧,如果您只有表单类型而没有基础表单类型,您可以添加一个简单的 Expression constraint:

use Symfony\Component\Validator\Constraints as Assert;

....

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add("is_my_first_boolean", ChoiceType::class, array(
            "expanded" => true,
            "multiple" => false,
            "choices" => array(
                'Yes' => "1",
                'No' => "0"
            ),
            'constraints' => [
                new Assert\Expression(array(
                    'expression' => 'value == 1 or this.getParent()["is_my_second_boolean"].getData() == 1',
                    'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
                ))
            ]
        ))
        ->add("is_my_second_boolean", ChoiceType::class, array(
            "expanded" => true,
            "multiple" => false,
            "choices" => array(
                'Yes' => "1",
                'No' => "0"
            ),
            'constraints' => [
                new Assert\Expression(array(
                    'expression' => 'value == 1 or this.getParent()["is_my_first_boolean"].getData() == 1',
                    'message' => 'Either is_my_first_boolean or is_my_second_boolean must be selected',
                ))
            ]
        ));
}

注意表达式中的第二个 or 是如何包含对其他字段的引用的。这样两个字段都得到 "error"。如果这太多了,您可以只删除一个约束,并且只有一个字段会突出显示错误。

如果您的表单由数据 class 支持,您当然可以将表达式约束添加到此 class:

/**
 * @Assert\Expression(
 *     "this.getisMyFirstBoolean() or this.getisMySecondBoolean()",
 *     message="Either first or second boolean have to be set",
 * )
 */
 class MyFormData

在这种情况下,错误消息显示在表单级别。