Symfony - 一个实体属性字段上的多个表单约束



假设我有一个具有$surname属性的Human实体,并且我有两种表单类型,一种用于创建实体,另一种用于在实体中搜索。当我将注释Assert/NotBlank()放在姓氏属性上时,它也用于搜索表单。

有没有办法指定特定表单应该使用哪个约束注释,哪些不应该?

使用注释,您还可以将验证组分配给实体约束,如下例所示(使用注释(:

/**
* @Assert/NotBlank(
*     groups={"search_form"} <--- VALIDATION GROUP
* )
*/
protected $surname;

根据您的需要,您可以添加一个或多个验证组,以在不同的形式/上下文中使用特定的断言,例如:groups={"registration", "edit", "search"}

然后,您可以阅读文档(链接适用于最新版本(以查看:

  • 如何在表单中定义验证组
  • 如何定义验证组以直接验证对象(不使用表单组件(

您可以从类中删除约束并在表单构建器中设置它,这将允许您对同一字段具有不同的约束:

class CreateHumanType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'surname',
                TextType::class,
                [
                    'label' => "surname",
                    'constraints' => [
                        new NotBlank(
                            [
                                'message' => "The surname is required",
                            ]
                        ),
                    ],
                ]
            );
    }
    //[...]
}
class SearchHumanType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'surname',
                TextType::class,
                [
                    'label' => "surname",
                    'required' => "false",
                ]
            );
    }
    //[...]
}

或者,您可以将约束保留在类中,并将字段设置为未映射以进行搜索:

class SearchHumanType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add(
                'surname',
                TextType::class,
                [
                    'label' => "surname",
                    'mapped' => false,
                    'required' => false,
                ]
            );
    }
    //[...]
}

然后,您必须在控制器中手动处理它。

最新更新