Получение сущности во встроенной коллекции форм - PullRequest
0 голосов
/ 06 марта 2019

В моей форме редактирования мне нужно получить объект сущности во встроенной форме. Это моя основная форма редактирования:

class OrderCollectionsEditType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('sampleCollections', CollectionType::class, [
                'entry_type' => SampleCollectionType::class,
                'allow_add' => true,
                'allow_delete' => true,
                'by_reference' => false
            ])
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Order::class,
        ]);
    }
}

и встроенный:

class SampleCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $sampleCollection = $builder->getData();
        $builder
            ->add('methods', EntityType::class, [
                'class' => Method::class,
                'multiple' => true,
            ])
            {...}
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => SampleCollection::class,
        ]);
    }
}

Форма, созданная в контроллере:

$form = $this->createForm(OrderCollectionsEditType::class, $order);

И проблема в том, что $sampleCollection возвращает NULL, но форма правильно заполнена значениями. Есть ли другой способ получить объект сущности?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Объект передается в форму в свойстве $options['data]. Вместо $sampleCollection = $builder->getData(); получите по $sampleCollection = $options['data];

0 голосов
/ 06 марта 2019

К сожалению, предложенное выше $options['data'] не работает с CollectionType, индекс «данных» отсутствует. После более глубокого исследования я нашел решение, мы можем использовать PRE_SET_DATA событие формы и затем получить объект сущности в функции слушателя.

РЕШЕНИЕ:

class SampleCollectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
                $sampleCollection = $event->getData();

                $form = $event->getForm();
                $form->add('methods', EntityType::class, [
                    'class' => Method::class,
                    'multiple' => true,
                ]);
            }
        ;
    }
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => SampleCollection::class,
        ]);
    }
}
...