【发布时间】:2014-04-22 11:33:06
【问题描述】:
我有一个控制器来处理来自 AJAX 请求的表单提交。不想重复自己,所以我把表单处理代码放在一个方法里:
// 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;
}
【问题讨论】: