Forms 带有集合验证的Symfony表单松散集合数据,不会持久化

Forms 带有集合验证的Symfony表单松散集合数据,不会持久化,forms,symfony,symfony-forms,Forms,Symfony,Symfony Forms,我创建了两个实体,其中一个用作另一个的集合 在这两个实体上,我都希望应用验证规则,但这样做时,我在验证集合时遇到两个问题: 如果我正确填写了所有必填字段(在main和collection中),则实体将被持久化 但如果我没有填写一个必填字段 我再也坚持不下去了,因为即使是我以后也会填上所有的必修课 字段我仍然有集合的验证错误消息 当我提交时,在集合中填写的(其他)数据丢失 奇怪的是(或不奇怪的是),如果我填写了主表单的必填部分,而不是收集部分,如果我提交,则会保留主表单中的数据。但反过来就不行了

我创建了两个实体,其中一个用作另一个的集合

在这两个实体上,我都希望应用验证规则,但这样做时,我在验证集合时遇到两个问题:

如果我正确填写了所有必填字段(在main和collection中),则实体将被持久化

但如果我没有填写一个必填字段

  • 我再也坚持不下去了,因为即使是我以后也会填上所有的必修课 字段我仍然有集合的验证错误消息

  • 当我提交时,在集合中填写的(其他)数据丢失

  • 奇怪的是(或不奇怪的是),如果我填写了主表单的必填部分,而不是收集部分,如果我提交,则会保留主表单中的数据。但反过来就不行了

    我真的不明白为什么会发生这种情况,也没有在其他帖子中看到对同样行为的描述

    带注释的我的实体(相关部分):

    在我的formbuilder中:

    class InstitutionType extends AbstractType
    {
      public function buildForm(FormBuilderInterface $builder, array $options)
      {
        $builder
          ->add('name', TextType::class, [
            'label' => 'name',
            'label_attr' => ['class' => 'mandatory'],
          ])
          ->add('institutionContacts', CollectionType::class, [
            'label' => 'user.institutionContact',
            'attr' => [
              'class' => 'collectiondata',
            ],
            'required' => true,
            'constraints' => new Valid(),
            'entry_type' => new InstitutionContactType($this->manager),
            'by_reference' => false,
            'allow_add' => true,
            'allow_delete' => true,
          ]);
          ...
      }
      public function configureOptions(OptionsResolver $resolver)
      {
        $resolver->setDefaults([
          'data_class' => Institution::class,
          'translation_domain' => 'SimusanteSimustoryBundle',
          'attr'=>['novalidate'=>'novalidate'], //disable html5 validation
        ]);
      }
    }
    

    你找到解决这个问题的方法了吗?唉,没有,但现在我在提交之前对所有必填字段进行JS检查。它很脏而且不理想,但我至今还没有找到解决方案。你找到解决方案了吗?唉,没有,但现在我在提交之前对所有必填字段进行了JS检查。它很脏而且不理想,但我至今还没有找到解决办法。
    class InstitutionType extends AbstractType
    {
      public function buildForm(FormBuilderInterface $builder, array $options)
      {
        $builder
          ->add('name', TextType::class, [
            'label' => 'name',
            'label_attr' => ['class' => 'mandatory'],
          ])
          ->add('institutionContacts', CollectionType::class, [
            'label' => 'user.institutionContact',
            'attr' => [
              'class' => 'collectiondata',
            ],
            'required' => true,
            'constraints' => new Valid(),
            'entry_type' => new InstitutionContactType($this->manager),
            'by_reference' => false,
            'allow_add' => true,
            'allow_delete' => true,
          ]);
          ...
      }
      public function configureOptions(OptionsResolver $resolver)
      {
        $resolver->setDefaults([
          'data_class' => Institution::class,
          'translation_domain' => 'SimusanteSimustoryBundle',
          'attr'=>['novalidate'=>'novalidate'], //disable html5 validation
        ]);
      }
    }