使用Symfony 4 Form处理PUT请求

sgtfey8w  于 2023-06-24  发布在  其他
关注(0)|答案(3)|浏览(110)

我曾经在控制器中使用edit和update方法来提交和处理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请求。
现在我想删除edit方法并从前端发送一个真正的PUT请求。当我使用Postman测试时,我发现update方法不能处理真正的PUT请求。
当我使用Postman发送POST +'_method'=' PUT '请求时,它工作正常,但当我发送PUT请求时,它显示BAD_REQUEST,这是我代码中的最后一行。isSubmitted()返回false。
我知道我不需要在这里使用Forms,但它已经在store方法中使用过了。是否可以使用它来处理真正的PUT请求?我应该在更新方法中更改什么?

igetnqfo

igetnqfo1#

似乎在update()方法中缺少了$entityManager->merge($category);。尝试将其添加到$entityManager->flush();上面,并让我们知道它是否有效。

elcex8rz

elcex8rz2#

你需要写_method而不是method
$form = $this->createForm(CategoryType::class, $category, ['_method' => 'PUT']);
在刷新之前,还需要持久化对象

vqlkdk9b

vqlkdk9b3#

使用6.2快速更新:确保在框架配置中将配置http_method_override设置为true
我尝试在代码中使用PUT方法来更新实体的控制器方法:

$form = $formFactory->create($formTypeClassName, $entity, array(
            'action' => Request::METHOD_PUT,
            'method' => $formMethod
        ));

上面的代码在前端呈现为一个带有POST方法的表单,以及一个带有PUT的隐藏输入_method-正如预期的那样。
但是:在处理表单数据的$form->handleRequest($request)中,该方法具有:
Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler::handleRequest(FormInterface $form):45

$method = $form->getConfig()->getMethod();

if ($method !== $request->getMethod()) {
   return;
}

$methodPUT,但$request->getMethod()POST-因此,处理程序只是返回,不采取任何行动,而不是“处理”请求。
一旦将http_method_override设置为true,两个值都是PUT,处理程序将执行操作。

相关问题