我有一个控制器,它处理来自AJAX请求的表单提交。我不想重复自己,所以我把表单处理代码的方法:使用PUT而不是POST提交表单
// Should process POST request
public function create(Request $request)
{
return $this->processEdit($request);
}
// Should process PUT request
public function update($id, Request $request)
{
$entity = $this->findEntity($id); // custom method
if (!$entity)
return $this->myCustomErrorResponse();
return $this->processEdit($request, $entity);
}
private function processEdit(Request $request, Entity $entity = null)
{
$form = $this->createForm('my_entity', $entity);
$form->handleRequest($request);
if ($form->isValid()) {
// Do something
} else {
// Handle invalid form
}
return $response;
}
我有以下两种途径:
ajax_create:
pattern:/
defaults: { _controller: 'MyBundle:Ajax:create' }
methods: [ POST ]
ajax_update:
pattern: /{id}
defaults: { _controller: 'MyBundle:Ajax:update' }
methods: [ PUT ]
requirements:
id: \d+
然而,当我通过AJAX提交表单,它不会接受PUT
请求,如果没有任何表单错误消息,返回表单无效。如果我改变控制器代码升技,
$form = $this->createForm('my_entity', $entity, array(
'method' => 'PUT',
));
...它将处理PUT
请求,但不POST
请求。
我想知道Symfony2的哪个部分检查表单的HTTP方法,所以我试图在源代码中寻找答案,但是我找不到线索。请问你们有没有分享你的知识?
另一个问题,有没有办法绕过HTTP方法检查?我正在通过$method
到上面显示的方法。
非常感谢。
更新:
为了使我的问题更清楚,我的Symfony2应用程序请求路由(POST和PUT)到正确的控制器方法。
我提到的改变上面的代码,那就是:
// Should process POST request
public function create(Request $request)
{
return $this->processEdit($request);
}
// Should process PUT request
public function update($id, Request $request)
{
$entity = $this->findEntity($id); // custom method
if (!$entity)
return $this->myCustomErrorResponse();
return $this->processEdit($request, 'PUT', $entity);
}
private function processEdit(Request $request, $method = 'POST', Entity $entity = null)
{
$form = $this->createForm('my_entity', $entity, array(
'method' => $method,
));
$form->handleRequest($request);
if ($form->isValid()) {
// Do something
} else {
// Handle invalid form
}
return $response;
}
嘿,那里。昨天我正在执行另一个类似的表单,我突然意识到我可以使用'Request :: getMethod()'!无论如何,非常感谢。 – pikachu0