如何从 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->redirect($this->generateUrl('route_name_where_i_want_to_go'));
的操作来将用户重定向到一个页面。
如果我使用公共函数 deleteGuestAction($id='4') 或任何其他存在的 id 号,它会成功运行。它以某种方式无法从模板中获取 id 号。我错过了什么?
注意:Sgoettschkes 的代码可能无法抵御 CSRF 攻击!以上是关于如何从 symfony2 中删除实体的主要内容,如果未能解决你的问题,请参考以下文章