当前位置: 首页 > 知识库问答 >
问题:

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

庞瀚
2023-03-14

我使用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中,但其他两个字段不应显示。但是,在验证过程中,如果选中了复选框“预定义的原因”,则第一个字段不应为必填字段,而“预定义的原因”应为必填字段。

共有1个答案

顾赞
2023-03-14

您应该能够使用表达式断言您的属性是否有效。

/**
 * @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。

您还可以创建一个自定义约束来执行类似的操作。

 类似资料:
  • 我想验证字段,如果存在,将失败,如果另一个字段不存在如何做到这一点?我已经创建了自定义验证,以获得基于存储ID的记录 我有字段和,并且字段根据在最大值和最小值之间进行验证,如果我显示=且未填写字段,则验证字段将通过,并显示错误,因为我未填写我希望在执行自定义验证之前检查是否为空。。 我已经阅读了laravel文档上的所有验证方法,但仍然没有找到解决方案。怎么做?

  • 问题内容: 我想按(不修改日期时间)将其排序(不修改日期时间),否则按(不发布日期时间)排序 问题答案: 似乎我每周在这里就此给出3条建议,也许我应该放弃并放任它:-)不,我不这么认为: __ 如果希望数据库很好地扩展,请 不要 在列计算(或子句)中使用逐行函数。你应该为你的具体情况检查性能( 测量,不要猜测 ),但是当做计算 读取 数据库通常会影响你的能力,规模(这不会不管你的通讯录数据库,但我

  • 问题内容: 我有两个字段,仅当两个字段都不存在时才是可选的: 现在,需要大于。如何包含此过滤器? 问题答案: 有 没有内置的验证 ,它可以让你比较字段值一样,在 Laravel ,所以你需要实现一个 自定义的验证 ,这将让你重新使用验证需要的地方。幸运的是,Laravel使编写自定义验证器 变得非常容易 。 首先在您的 AppServiceProvider中 定义新的验证器: 现在,您可以在 $

  • 问题内容: 有没有一种方法可以使用此处定义的注释来定义Hibernate验证规则,说明至少一个字段不能为null? 这将是一个假设的示例(实际上不存在): 在所示的情况下,fieldA可以为null或fieldB可以为null,但不能同时为两者。 一种方法是创建自己的验证器,但是我想避免它已经存在。如果您已经验证过,请分享一个验证人…谢谢! 问题答案: 我终于写了整个验证器: 用法示例:

  • 我有一个工作表单,它有一个必填字段,不能为空: 如果我在请求中指定此字段,但将该字段保留为空,则会得到以下响应: 如果我在请求中省略此字段,我将得到以下响应: 有没有一些内置的Symfony逻辑,我可以用它来使第二个例子与第一个例子相匹配? [编辑]使用的是Symfony 2.5-现在更新为Symfony 2.8。同样的问题。

  • 我想用JSR-303。 我有一块地。如果在这个字段中输入了某个值,我想要求其他几个字段不是。 我在试图弄清楚这一点。不确定我该怎么称呼它来帮助找到一个解释。 任何帮助都将不胜感激。我对这个很陌生。 目前我正在考虑一个自定义约束。但我不确定如何从注释中测试依赖字段的值。基本上,我不确定如何从注释访问panel对象。 这是给我带来了麻烦...