Ошибка типа Symfony: переданный аргумент должен быть экземпляром объекта или null, указан ArrayCollection

Я получаю следующую ошибку:

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 имеет отношение ManyToMany к сущности 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
      }
    }
  ]
}

person sonja    schedule 28.08.2017    source источник


Ответы (2)


Вы должны передать объект Channel1 в ваш formModifier, здесь вы передаете $event->getForm()->getData(), который не является типом канала1

person t-n-y    schedule 28.08.2017
comment
хорошо и как мне это сделать? с помощью get Data я думал, что получу данные, которые я выбрал в строке формы для Channel1? - person sonja; 28.08.2017
comment
что у вас есть, когда вы делаете дамп вашего $event->getForm()->getData() ? - person t-n-y; 28.08.2017
comment
ArrayCollection {#1828 ▼ -elements: array:1 [▶] } это вывод - person sonja; 28.08.2017
comment
можешь показать ВЕСЬ дамп, чтобы мы могли видеть тип и все - person t-n-y; 28.08.2017
comment
К сожалению, я никогда не использовал его раньше и не знал, что вы можете расширить! Добавлю в пост! - person sonja; 28.08.2017
comment
Итак, вы ясно видите, что у вас есть не объект channel1, а arrayCollection, что логично, потому что у вас есть поле с несколькими типами объектов. поэтому у вас не может быть объекта channel1 в вашем formModifier. вы должны изменить свой код - person t-n-y; 28.08.2017
comment
Да, я конечно понимаю, но я не понимаю, как это сделать. Мне абсолютно необходим множественный выбор для моих задач, поэтому это не должен быть только один объект Channel1. У Вас есть какие-то предложения? - person sonja; 28.08.2017
comment
удалите тип channel1 в formModifier и запросите formCollection - person t-n-y; 28.08.2017
comment
Давайте продолжим обсуждение в чате. - person sonja; 28.08.2017
comment
Я переместил это в чат, хорошо? :) - person sonja; 28.08.2017

Для получения объекта channel1 из коллекции массивов вы должны заменить приведенный ниже код:

channel1s = $event->getForm()->getData();

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

by

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

$formModifier($event->getForm()->getParent(), $channel1s);
person abderrahime sanadi    schedule 29.08.2017