Php 将动态生成的表单嵌入到另一个表单中

Php 将动态生成的表单嵌入到另一个表单中,php,forms,symfony,symfony-forms,symfony-2.1,Php,Forms,Symfony,Symfony Forms,Symfony 2.1,我使用Symfony2.1的FormBuilder在控制器中创建动态表单: $form = $this->createFormBuilder($defaultData); $form->add('field','text'); 我想以同样的方式嵌入另一个表单,并将其与主表单一起嵌入 $subForm = $this->createFormBuilder(); $subForm->add('subfield','text'); // Does not work $for

我使用Symfony2.1的FormBuilder在控制器中创建动态表单:

$form = $this->createFormBuilder($defaultData);
$form->add('field','text');
我想以同样的方式嵌入另一个表单,并将其与主表单一起嵌入

$subForm = $this->createFormBuilder();
$subForm->add('subfield','text');

// Does not work
$form->add('subform', $subForm);
不幸的是,此设置无法正常工作。我找不到任何方法来将动态生成的子表单添加到动态生成的表单中,如上面的示例所示

我缺少的函数调用是什么

上面的示例代码引发的异常是

UnexpectedTypeException:应为类型为“字符串或”的参数 Symfony\Component\Form\FormTypeInterface“, 给定“Symfony\Component\Form\Form”


我将在两个单独的字段中创建两个表单类别:

<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class FirstFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('field', 'text')
            ->add('subform', new SecondFormType());
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\FirstEntity'
        ));
    }

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



<?php

namespace Acme\DemoBundle\Form\Type;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;

class SecondFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('subfield', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'Acme\DemoBundle\Entity\SecondEntity',
        ));
    }

    public function getName()
    {
        return 'second';
    }
}
或版本表格:

$form = $this->createForm(new FirstFormType());
$form = $this->createForm(new FirstFormType(), $first);
在示例代码中,您试图将整个表单而不是表单类型分配给字段


希望它能有所帮助,建议symfony方法是创建单独的FormType类,如上所述。但是如果你真的想

您可以通过调用

$formBuilder->add($subform /* FormBuilder */);
如果使用
$This->createFormBuilder()创建此子表单,则其名称将为
“表单”
,这意味着您不能添加以这种方式创建的两个或多个子表单-较新的子表单将用相同的名称覆盖以前的子表单

如果需要添加多个子表单,则必须使用

$this->get('form.factory')->createNamedBuilder($uniqName)

不上课。。。在控制器动作中:

$subFormBuilder = $this->createFormBuilder(
        null /* default data */, 
        ['label' => 'Sub Form'] /* options */
    )
    ->add('name');

$form = $this->createFormBuilder()
    ->add($subFormBuilder)
    ->add('number')
    ->getForm();

谢谢,这个解决方案非常适合我的原始(和旧)问题的范围。关键确实是调用
FormFactory::createNamedBuilder()
。有时你真的不想,但真的需要:)这是最好的答案,不知道为什么另一个有这么多赞成票。