php - Symfony 5 Delete方法,无法猜测如何从参数的请求信息中获取Doctrine实例
问题描述
我想在我的控制器中添加第二个删除按钮来删除评论,但我收到了很多错误消息,例如来自 ParamConverter 的错误消息,因为它无法识别该类。
所以在我的控制器中,我有一个这样的 ParamConverter:
/**
* @Route("/delete/{comment_id}", name="comment_delete", methods={"DELETE"})
* @ParamConverter("comment", class="App:Comment", options={"id": "id"})
*/
public function deleteComment(Request $request, BlogPost $blogPost, Comment $comment, $comment_id): Response
{
if ($this->isCsrfTokenValid('delete' . $comment->getId(), $request->request->get('_token'))) {
$entityManager = $this->getDoctrine()->getManager();
$entityManager->remove($comment);
$entityManager->flush();
return $this->redirectToRoute('/');
}
return $this->render('comments/_delete_form.html.twig', [
'comment' => $comment
]);
}
在我的树枝中,我添加了这个:
<form method="post" action="{{ path('comment_delete', {'comment_id': comment.id}) }}" onsubmit="return confirm('Are you sure you want to delete this item?');">
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_token" value="{{ csrf_token('delete' ~ comment.id) }}">
<button class="btn delete">Delete</button>
</form>
但它会创建一条错误消息:
“无法猜测如何从参数的请求信息中获取 Doctrine 实例”注释“。
解决方案
通常,如果您在函数签名中输入提示,Symfony 会尝试自动将路由参数转换为实体。例如,由于您不使用BlogPost
实体,您可以只写:
/**
* @Route("/delete/{id}", name="comment_delete", methods={"DELETE"})
*/
public function deleteComment(Comment $comment): Response
当然,您也应该更改 twig 函数中的参数名称。
如果您想更明确并保持参数名称不变,为清楚起见,您可以编写:
/**
* @Route("/delete/{comment_id}", name="comment_delete", methods={"DELETE"})
* @ParamConverter("comment", options={"id" = "comment_id"})
*/
为了将路由参数映射到列名。
您收到的错误是因为您写了options={"id": "id"}
告诉转换器使用 url 中的参数查找实体id
,当然没有id
参数。
推荐阅读
- rust - 根据目标平台生成 Rust 可执行文件或库
- php - PHP循环遍历没有索引名称的数组
- reactjs - 获取使用在 IE11 中工作的 create-react-app 创建的应用程序
- javascript - 如何在用户单击复选框所在的行时切换复选框?
- swift - Stripe 与 iOS 的集成:保存和引用已保存的卡片
- google-cloud-platform - 数据流 - 使用私有 IP 调用外部 API
- python - 无法在 Django 的同一数据库中的第二个表中插入数据
- javascript - Discordjs我如何发送带有多链接的嵌入消息
- reactjs - 如何使用钩子复制此设置状态逻辑
- python - 试图理解 sort(key = ...) 函数