我曾经在控制器中使用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请求?我应该在更新方法中更改什么?
3条答案
按热度按时间igetnqfo1#
似乎在
update()
方法中缺少了$entityManager->merge($category);
。尝试将其添加到$entityManager->flush();
上面,并让我们知道它是否有效。elcex8rz2#
你需要写_method而不是method
$form = $this->createForm(CategoryType::class, $category, ['_method' => 'PUT']);
在刷新之前,还需要持久化对象
vqlkdk9b3#
使用6.2快速更新:确保在框架配置中将配置
http_method_override
设置为true
。我尝试在代码中使用
PUT
方法来更新实体的控制器方法:上面的代码在前端呈现为一个带有
POST
方法的表单,以及一个带有PUT
的隐藏输入_method
-正如预期的那样。但是:在处理表单数据的
$form->handleRequest($request)
中,该方法具有:Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationRequestHandler::handleRequest(FormInterface $form):45
:$method
是PUT
,但$request->getMethod()
是POST
-因此,处理程序只是返回,不采取任何行动,而不是“处理”请求。一旦将
http_method_override
设置为true
,两个值都是PUT
,处理程序将执行操作。