如何从 symfony2 中删除实体

Posted

技术标签:

【中文标题】如何从 symfony2 中删除实体【英文标题】:How do I delete an entity from symfony2 【发布时间】:2012-08-02 07:50:01 【问题描述】:

我的第一个 symfony2 项目是存储在数据库中的来宾列表(受邀参加活动)。我有

为实体类Guest创建了所有变量(id、姓名、地址、电话号码等) 在 mysql 数据库中创建了架构 为树枝模板“添加客人”创建了一条路线 创建了一个formType

最后是控制器中的“createGuest”方法,一切正常。

我无法从数据库中删除来宾。我已经阅读了网络上的所有教程,包括官方的 Symfony2 书;它所说的只是:

删除对象

删除一个对象很相似,但是需要调用实体管理器的 remove() 方法:

$em->remove($product);
$em->flush();

它没有说明如何将控制器 deleteAction($id) 与 twig 模板连接起来(甚至“更新对象”部分也缺少文档)。我想要做的是使用 viewGuests 操作和 viewGuests 树枝模板列出所有来宾,每行旁边都有一个删除图标,您应该单击它来删除一个条目。很简单,但我找不到任何文档,也不知道从哪里开始。

public function deleteGuestAction($id)
    
        $em = $this->getDoctrine()->getEntityManager();
        $guest = $em->getRepository('GuestBundle:Guest')->find($id);

        if (!$guest) 
            throw $this->createNotFoundException('No guest found for id '.$id);
        

        $em->remove($guest);
        $em->flush();

        return $this->redirect($this->generateUrl('GuestBundle:Page:viewGuests.html.twig'));
    

【问题讨论】:

其实没有错误。我不知道如何连接树枝模板。这意味着:您有一个表格,其中每一行中都有一个客人和一些信息(姓名、姓氏、电话号码等)以及一个 图标。我想单击该按钮并从数据库中删除该行。 在 find() 之后你的 Guest 是否加载良好?否则,试试这个原型 public function deleteGuestAction(Guest $guest) 并删除你的前两行。也尝试 var_dump 你的 $guest 感谢您的回复。我应该如何将 Guest.name 从树枝模板发送到控制器? 为什么要发名字?你发送 id 做得很好。 这个给我控制器 "xxxxxBundle\Controller\PageController::deleteGuestAction()" 要求你为 "$id" 参数提供一个值(因为没有默认值或者因为有一个此参数之后的非可选参数)。 【参考方案1】:

从...删除,其中 id=...;

protected function templateRemove($id)
    $em = $this->getDoctrine()->getManager();
    $entity = $em->getRepository('XXXBundle:Templates')->findOneBy(array('id' => $id));

    if ($entity != null)
        $em->remove($entity);
        $em->flush();
    

【讨论】:

【参考方案2】:

Symfony 很聪明,知道如何自己制作find()

public function deleteGuestAction(Guest $guest)

    if (!$guest) 
        throw $this->createNotFoundException('No guest found');
    

    $em = $this->getDoctrine()->getEntityManager();
    $em->remove($guest);
    $em->flush();

    return $this->redirect($this->generateUrl('GuestBundle:Page:viewGuests.html.twig'));

要在控制器中发送 id,请使用 path('your_route', 'id': guest.id)

【讨论】:

我想我更进一步了。单击每个条目的删除图标会给我一个类似“/deleteguest?id=4”的链接,这似乎是模板发送当前来宾行的 id。不幸的是,我收到了这条消息:“无法猜测如何从请求信息中获取 Doctrine 实例。” 您的解决方案有效。 routing.yml 文件中缺少 /id 标记。我认为 deleteguest?id=4 会完成这项工作,但事实并非如此。最后 deleteguest/4 似乎很好。非常感谢。 我认为Symfony在找不到实体时会自己抛出异常,所以第一个条件语句并不是真的必要。 这是有效的,因为 ParamConverter 正在将您的 ID 转换为幕后的访客实体。没有它,你仍然需要自己做 find() 对于 symfony 2.6,包含的学说中的 getEntityManager 方法已被弃用。您应该更新答案以使用: $em = $this->getDoctrine()->getManager();【参考方案3】:

据我了解,您很难在模板中添加什么内容。

我举个例子:

<ul>
    % for guest in guests %
    <li> guest.name  <a href=" path('your_delete_route_name','id': guest.id) ">[[DELETE]]</a></li>
    % endfor %
</ul>

现在发生的情况是它遍历来宾中的每个对象(如果您的对象集合以其他方式命名,则必须重命名它!),显示名称并放置正确的链接。路线名称可能不同。

【讨论】:

这适用于客人列表中的链接,但它会重定向到 deleteGuest.html.twig 文件...我不知道该放什么! 所以你的问题是重定向?我不知道你的用法,但我正在做类似return $this-&gt;redirect($this-&gt;generateUrl('route_name_where_i_want_to_go')); 的操作来将用户重定向到一个页面。 如果我使用公共函数 deleteGuestAction($id='4') 或任何其他存在的 id 号,它会成功运行。它以某种方式无法从模板中获取 id 号。我错过了什么? 注意:Sgoettschkes 的代码可能无法抵御 CSRF 攻击!

以上是关于如何从 symfony2 中删除实体的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 2 从实体管理器获取实体的原始数据

如何在 Symfony2 中单向持久化一对一实体

在 symfony2 中创建表

如何在 Symfony2 中将 Json 绑定到实体中

Symfony2 KnpPaginator bundle 从多个实体获取数据并在一个网格/分页中呈现

如何在 Symfony2 中获取代表当前用户的实体?