【问题标题】:Symfony - Multiple form constraints on one entity property fieldSymfony - 一个实体属性字段上的多个表单约束
【发布时间】:2018-04-15 15:21:03
【问题描述】:

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

有什么方法可以指定特定表单应该使用哪些约束注释,哪些不应该使用?

【问题讨论】:

    标签: forms symfony constraints entity


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

      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,
                      ]
                  );
          }
          //[...]
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2015-11-28
        • 2015-08-04
        相关资源
        最近更新 更多