Symfony2 Forms - 无法在集合中添加/删除实体

时间:2012-04-23 09:23:59

标签: symfony symfony-forms

我有一个“Person”实体的表单,其中包含“Nicknames”的集合。

我按照食谱中的指南(http://symfony.com/doc/current/cookbook/form/form_collections.html)实现了这个

当我创建一个新的“Person”时,我可以成功地添加“Nicknames”。

使用类似的表格,我有一个编辑页面。在编辑页面上,我以与新页面相同的方式设置了前端。

在编辑页面上,我可以成功编辑现有的昵称和其他简单字段。但是,当我提交一个新的“昵称”(或尝试删除一个)时,它不起作用。

在将请求对象绑定到“Person”之前,我已经对其进行了var_dump(),并且在绑定后我将var_dump()编辑为“Person”对象。该请求确实正确传递了“Nicknames”集合。但是,尽管所有内容都与新页面相同,但它们根本没有绑定到Person。此外,我仍然可以编辑现有的昵称,因此它正在这方面工作。

我不能为我的生活弄清楚为什么Symfony不会创建这些新的昵称或者将它们添加到Person中。我环顾四周搜索,但一切都确认它应该有效 - 但事实并非如此。

表示人员表单类型上的昵称条目:

->add('nicknames', 'collection', array(
        'type'           => new NicknameType(),
        'allow_add'      => true,
        'allow_delete'   => true,
        'prototype'      => true,
        'by_reference'   => false,
        'required'       => false
))

昵称类型只有一个字段 - “昵称”及其文本输入。

有任何帮助吗?谢谢你的阅读。

编辑:

以下是更新操作(将人员更改为播放器):

public function updateAction($id, Request $request)
{
    $em = $this->getDoctrine()->getManager();

    $player = $em->getRepository('SCDBAppBundle:Player')->find($id);

    if (!$player) {
        throw $this->createNotFoundException('Unable to find Player.');
    }

    $editForm   = $this->createForm(new EditPlayerType(), $player);
    $deleteForm = $this->createGenericIDForm($id);

    $editForm->bindRequest($request);

    if ($editForm->isValid()) {
        $em->persist($player);
        $em->flush();

        return $this->redirect($this->generateUrl('admin_player_edit', array('id' => $id)));
    }

    return array(
        'player'      => $player,
        'edit_form'   => $editForm->createView(),
        'delete_form' => $deleteForm->createView(),
    );
}

我意识到要实际坚持删除昵称,我需要更改代码以保持不变。我现在甚至不担心持久性,因为主要问题是在将请求绑定到Player表单后,$ player对象不包含更新的Nicknames集合。

3 个答案:

答案 0 :(得分:0)

如果您不使用Symfony master而是使用2.0.x,请注意,因为“集合”类型存在错误。但是,如果您使用的是Symfony master,请确保包含最新版本的Doctrine(2.2.3或2.1.7),因为已修复了两个影响“集合”类型正确工作的错误。

答案 1 :(得分:0)

也许尝试使用NicknameType::class代替新的NicknameType()

我建议将cascade: [ persist ] conf属性添加到您的实体。

答案 2 :(得分:-1)

您必须使用以下命令从请求中获取数据:

$objPerson = $editForm->getData();
$em->persist($objPerson);
$em->flush();

否则,您无需更改表单即可更新旧对象。

简短:您之前只更新了从数据库加载的对象。