Symfony 表单验证:如果另一个字段不为空则需要字段
Symfony form validation: require field if another field is not empty
我使用 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” - 应该是。
您应该能够使用 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 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” - 应该是。
您应该能够使用 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 来做类似的事情。