【问题标题】:Symfony Type error: Argument passed must be an instance of entity or null, ArrayCollection givenSymfony 类型错误:传递的参数必须是实体的实例或 null,给定的 ArrayCollection
【发布时间】:2017-08-28 14:25:33
【问题描述】:

我收到以下错误:

Type error: Argument 2 passed to DocumentBundle\Form\SelectionType::DocumentBundle\Form\{closure}() must be an instance of ReferentialBundle\Entity\Channel1 or null, instance of Doctrine\Common\Collections\ArrayCollection given, called in /srv/http/sp/src/DocumentBundle/Form/SelectionType.php on line 133

很遗憾,我在 FormType 中没有看到我的错误。

看起来是这样的:

    class SelectionType extends AbstractType {

      protected $em;

      public function __construct(\Doctrine\ORM\EntityManager $em)
      {
          $this->em = $em;
      }


      public function buildForm(FormBuilderInterface $builder, array $options)
        {


          $builder
          ->add('channel1s', EntityType::class, array(

            'class' => 'ReferentialBundle:Channel1',
            'property' => 'name',
            'label' => 'label.channel1s',
            'empty_value' => 'label.select_channel1s',
            'mapped' => false,
            'expanded' => false,
            'translation_domain' => 'UploadProfile',
            'multiple' => true,
            'required' => false,
          ));

          $formModifier = function (FormInterface $form, Channel1 $channel1s = null) {
            $channel3s = null === $channel1s ? array() : $channel1s->getChannel3s();

            $form
            ->add('channel3s', EntityType::class, array(
              'class' => 'ReferentialBundle:Channel3',
              'choices' => $channel3s,
            ));
          };
          $builder->addEventListener(
            FormEvents::PRE_SET_DATA,
            function (FormEvent $event) use ($formModifier) {
              $data = $event->getData();
              $formModifier($event->getForm(), $data->getChannel1s()[0]);
            }
          );
          $builder->get('channel1s')->addEventListener(
            FormEvents::POST_SUBMIT,
            function (FormEvent $event) use ($formModifier) {
              $channel1s = $event->getForm()->getData();

              $formModifier($event->getForm()->getParent(), $channel1s);

            }

            );

            $builder
            ->add('agencies', EntityType::class, array(
            'class' => 'AppBundle:Agency',
            'property' => 'agent_name',
            'label' => 'label.agencies',
            'empty_value' => 'label.select_agency',
            'expanded' => false,
            'translation_domain' => 'UploadProfile',
            'multiple' => true,
            ));
        }
      public function configureOptions(OptionsResolver $resolver)
      {
        $resolver->setDefaults(array(
          'data_class' => 'DocumentBundle\Entity\UploadProfile',
          'em' => null,

        ));
      }


      public function getName()
      {
          return 'uploadprofile';
      }
    }

错误在于这一行中的 $channel1s 变量:

 $formModifier($event->getForm()->getParent(), $channel1s);

Channel1 与 Uploadprofile 实体具有多对多关系。

编辑

这里是转储:

ArrayCollection {#1828 ▼
  -elements: array:1 [▼
    0 => Channel1 {#1812 ▼
      #id: "C"
      #translationKey: "name.c"
      #name: "Consolidator"
      -uploadProfiles: PersistentCollection {#1895 ▼
        -snapshot: []
        -owner: Channel1 {#1812}
        -association: array:16 [ …16]
        -em: EntityManager {#456 …11}
        -backRefFieldName: "channel1s"
        -typeClass: ClassMetadata {#1810 …}
        -isDirty: false
        #collection: ArrayCollection {#1896 ▼
          -elements: []
        }
        #initialized: false
      }
      #channel3s: PersistentCollection {#1879 ▼
        -snapshot: []
        -owner: Channel1 {#1812}
        -association: array:15 [ …15]
        -em: EntityManager {#456 …11}
        -backRefFieldName: "channel1"
        -typeClass: ClassMetadata {#1748 …}
        -isDirty: false
        #collection: ArrayCollection {#1878 ▼
          -elements: []
        }
        #initialized: false
      }
    }
  ]
}

【问题讨论】:

    标签: symfony typeerror instanceof arraycollection


    【解决方案1】:

    你必须将Channel1对象传递给你的formModifier,这里你传递$event->getForm()->getData(),它不是channel1类型

    【讨论】:

    • 好的,我该怎么做?使用 get Data 我想我会得到我在表格行中为 Channel1 选择的数据?
    • 当你转储你的 $event->getForm()->getData() 时你有什么?
    • ArrayCollection {#1828 ▼ -elements: array:1 [▶] } 这是输出
    • 你能显示所有的转储,所以我们可以看到类型和所有
    • 哎呀对不起,我以前从未使用过它,不知道您可以扩展!我会把它添加到帖子中!
    【解决方案2】:

    要从 arraycollection 中获取对象 channel1,您必须替换以下代码:

    channel1s = $event->getForm()->getData();
    
    $formModifier($event->getForm()->getParent(), $channel1s);
    

    通过

    channel1s = $event->getForm()->getData()->first();
    
    $formModifier($event->getForm()->getParent(), $channel1s);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-28
      • 2017-01-09
      • 1970-01-01
      • 2017-10-17
      • 2015-07-01
      • 1970-01-01
      • 2018-08-30
      相关资源
      最近更新 更多