使用Symfony 4表单处理PUT请求

时间:2019-01-07 12:47:06

标签: symfony symfony4

我以前在控制器中使用编辑和更新方法来提交和处理PUT表单提交。它工作正常,代码看起来像这样,

public function edit(Category $category): Response
{
    $form = $this->createForm(CategoryType::class, $category, [
        'action' => $this->generateUrl('category_update', [
            'id' => $category->getId(),
        ]),
        'method' => 'PUT',
    ]);

    return $this->render('category/edit.html.twig', [
        'category_form' => $form->createView(),
    ]);
}

public function update(Category $category, Request $request): Response
{
    $form = $this->createForm(CategoryType::class, $category, ['method' => 'PUT']);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->flush();

        return new Response('', Response::HTTP_NO_CONTENT);
    }

    return new Response('', Response::HTTP_BAD_REQUEST);
}

由于HTML表单不支持PUT,因此编辑请求使用带有'_method'参数的POST作为'PUT'来代替实际的PUT请求。

现在,我想删除编辑方法,并从前端发送真实的PUT请求。当我使用Postman对此进行测试时,我发现update方法无法处理实际的PUT请求。

当我使用Postman发送POST +'_method'='PUT'请求时,它工作正常,但是当我发送PUT请求时,它显示BAD_REQUEST,这是我代码的最后一行。 isSubmitted()返回false。

我知道我不需要在这里使用Forms,但是在store方法中已经使用过它。是否可以使用它来处理实际的PUT请求?我的更新方法应该改变什么?

2 个答案:

答案 0 :(得分:0)

似乎您在$entityManager->merge($category);方法中缺少update()。尝试将其添加到$entityManager->flush();上方,并告诉我们是否可行。

答案 1 :(得分:0)

您需要编写_method而不是方法

$form = $this->createForm(CategoryType::class, $category, ['_method' => 'PUT']);

还需要在刷新之前保留对象