Php 如何使用createNamedBuilder()绑定实体?

Php 如何使用createNamedBuilder()绑定实体?,php,symfony,Php,Symfony,我需要在一个页面上有两个不同的表单(但使用相同的实体)。为此,我使用了createNamedBuilder(): 我的问题是,如何将我的实体绑定到它?当我使用createFormBuilder()时 $game = new Game; $form = $this->createFormBuilder($game); 如果我尝试像这样使用createFormBuilder: $cover = $this->createFormBuilder($game) -&

我需要在一个页面上有两个不同的表单(但使用相同的实体)。为此,我使用了
createNamedBuilder()

我的问题是,如何将我的实体绑定到它?当我使用
createFormBuilder()

$game = new Game;
$form = $this->createFormBuilder($game);
如果我尝试像这样使用
createFormBuilder

    $cover = $this->createFormBuilder($game)
        ->add('file')
        ->getForm();

    $data = $this->createFormBuilder($game)
        ->add('name')
        ->getForm();
$game = new Game;

$cover = $this->get('form.factory')->createNamedBuilder('cover', 'form', $game)
    ->add('file')
    ->getForm();

$data = $this->get('form.factory')->createNamedBuilder('data', 'form', $game)
    ->add('name','text')
    ->getForm();
使用secound表单会导致“此表单不应包含额外字段”。注意。

根据,可以使用
createNamedBuilder
的第三个参数传入实体

您的代码应该如下所示:

    $cover = $this->createFormBuilder($game)
        ->add('file')
        ->getForm();

    $data = $this->createFormBuilder($game)
        ->add('name')
        ->getForm();
$game = new Game;

$cover = $this->get('form.factory')->createNamedBuilder('cover', 'form', $game)
    ->add('file')
    ->getForm();

$data = $this->get('form.factory')->createNamedBuilder('data', 'form', $game)
    ->add('name','text')
    ->getForm();

(请注意,如果您碰巧仍在使用Symfony 2.0,则第一个和第二个参数的位置将被交换。)

在Symfony 2.8/3.0中,这一点发生了一些变化,如果您有一个表单希望绑定其他实体,请在此处查看我的答案:

如果有人正在使用
form.factory
服务中的
createNamedBuilder
createNamedBuilder
函数,下面是有关如何使用它设置和保存数据的代码段。您不能使用
数据
字段(保留该空值),必须将传递的数据/实体设置为
$options

我还加入了@sarahg关于使用
setAllowedTypes()
setRequired()
选项的说明,看起来效果不错,但首先需要使用
setDefined()定义字段

如果您需要设置数据,请记住将其添加到
data
字段中

在控制器中,我正在使用
getBlockPrefix
,因为
getName
2.8/3.0

控制器

/*
* @var $builder Symfony\Component\Form\FormBuilderInterface
*/

$formTicket = $this->get('form.factory')->
              createNamed(
                  $tasksPerformedForm->getBlockPrefix(),
                  TaskAddToTicket::class,
                  null,
                  array(
                      'ticket' => $ticket
                  )
              );
表格

public function configureOptions(OptionsResolver $resolver)    {
    $resolver->setDefined('ticket');
    $resolver->setRequired('ticket');
    $resolver->addAllowedTypes('ticket', Ticket::class);

    $resolver->setDefaults(array(           
        'translation_domain'=>'AcmeForm',
        'validation_groups'=>array('validation_group_001'),
        'tasks' => null,
        'ticket' => null,
    ));
}

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

    $this->setTicket($options['ticket']);
    //This is required to set data inside the form!
    $options['data']['ticket']=$options['ticket'];

    $builder

        ->add('ticket',  HiddenType::class, array(
                'data_class'=>'acme\TicketBundle\Entity\Ticket',
            )
        )
...
}

每个表单的用途是什么?它可以在很多情况下使用,特别是当您想要添加太多“单击此处”链接时,例如,您可以在一个页面上登录或注册。在这里,我想分别在数据库中使用图像上传和插入,这样用户就可以在整个事情进入数据库之前看到图像。对于使用
createFormBuilder
,您是否尝试在没有数据传递到表单时绑定表单?你能发布更多的控制器代码吗?实际上你试过多步骤表单吗?看来你想干什么就干什么。我很可能得自己做点什么。Squazic的包对我来说现在有点太多了。虽然这可能回答了问题,但在这里包括答案的基本部分,并提供链接供参考。@IKavanagh我在链接下面添加了整个答案。但这并不是干的,这就是为什么我只发布了一个链接。