首页 > 解决方案 > 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 实例”注释“。

标签: phpsymfonyparameterstwigsql-delete

解决方案


通常,如果您在函数签名中输入提示,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参数。


推荐阅读