Symfony 表单验证:如果另一个字段不为空,则需要字段

Posted

技术标签:

【中文标题】Symfony 表单验证:如果另一个字段不为空,则需要字段【英文标题】:Symfony form validation: require field if another field is not empty 【发布时间】:2022-01-17 19:37:00 【问题描述】:

我使用 Symfony 5.3。我有一个包含 3 个字段的表单,这些字段未映射到任何实体:

“原因” - 文字, “use_predefined” - 复选框 “predefined_reason” - 下拉菜单。

我这样构建表单(片段):

...
public function build(FormBuilderInterface $builder)

    $builder->add('reason', TextareaType::class, [
        'label' => 'Reason',
        'required' => true,
        'mapped' => false,
    ]);
    $builder->add('use_predefined', 
        CheckboxType::class, [
        'label' => 'Use predefined reason',
        'required' => false,
        'mapped' => false,
    ]);
    $builder->add(
        'predefined_reason',
        ChoiceType::class,
        [
            'choices' => [
                'option 1' => 1,
                'option 2' => 2,
                'option 3' => 3,
                'option 4' => 4,
            ],
            'expanded' => false,
            'mapped' => false,
            'label' => 'some label',
            'required' => false,
        ]
    );

...

“原因”字段应按要求显示在 UI 中,但其他两个不应显示。但是在验证过程中,如果选中了“predefined_reason”复选框,则第一个字段不应该是必需的,而“predefined_reason” - 应该。

【问题讨论】:

【参考方案1】:

您应该能够使用Expression 来断言您的属性是否有效。

/**
 * @Assert\Expression(
 *     "(this.getUsePredefined() == true) or (this.getUsePredefined() == false and this.getReason() != null)",
 *     message="UsePredefined is not checked so reason is required"
 * )
 */
protected $reason;


protected $use_predefined;

/**
 * @Assert\Expression(
 *     "(this.getUsePredefined() == true and this.getPredefinedReason() != null) or (this.getUsePredefined() == false)",
 *     message="Error message"
 * )
 */
protected $predefined_reason;

不要忘记编辑您的表单并在不必要时删除必填字段,因为它们将在表单验证中得到验证。

如果你想要更动态的东西,你可能不得不使用 javascript

您也可以创建一个custom contraint 来做类似的事情。

【讨论】:

以上是关于Symfony 表单验证:如果另一个字段不为空,则需要字段的主要内容,如果未能解决你的问题,请参考以下文章

验证电子邮件字段并确保不为空

如果字段不为空,则添加对验证器的检查

Angular 5 - 表单验证电子邮件

如何在提交表单之前验证电子邮件字段不为空

PHP表单没有正确验证表单字段

Laravel 验证仅在字段不为空时验证正则表达式