我在视图中通过Ajax调用的Symfony2控制器中的一个函数。这是控制器端的代码(不是真实的例子):
public function addFabAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$response['success'] = TRUE;
if ($request->isXmlHttpRequest()) {
$entity = new Entity();
$form = $this->createForm(new EntityForm(), $entity);
$form->handleRequest($request);
if ($form->isValid()) {
try {
$em->persist($entity);
$em->flush();
$response['entities'] = array();
$dataResponse = array();
$dataResponse['colOne'] = $$entity->getColumnOne();
$dataResponse['colTwo'] = $$entity->getColumnTwo();
$response['entities'][] = $dataResponse;
} catch (Exception $ex) {
$response['success'] = FALSE;
}
} else {
// Response for go through .fail() callback in Ajax request
}
return new JsonResponse($response);
}
}
然后在视图中我调用了一些事件如下:
$.post(Routing.generate('addFab'), $form.serialize(), 'json').done(function (data, textStatus, jqXHR) {
// if all goes fine then show messages and much more
}
}).fail(function () {
// if something goes wrong then show and alert and try to show info to the user
return false;
}).always();
现在,如果$form->isValid()
为TRUE,则始终会发出请求,因此会进行.done()
回调,因此我需要返回一些内容,而不清楚是什么,如果表单不是有效的,那么响应会通过.fail()
回调,否则我总是需要检查$response['success']
回调中.done()
是否为TRUE或FALSE而忘记{{1}这对我来说似乎不对。如果正确的方法是使用HttpFoundation Componente返回异常,那么我现在不知道其他任何建议吗?最好的方法是什么?
答案 0 :(得分:2)
当服务器返回错误状态(如4xx或5xx)或者返回数据的客户端解析错误或请求中止调用时,将调用错误处理程序。
在这种情况下,由于您希望将请求发送到失败处理程序的验证,您需要将响应状态设置为错误状态,如400.所以在else
块中尝试
<?php
http_response_code(400);
?>
答案 1 :(得分:1)
我知道这已经得到了回答,但我认为这不是最佳方式。
JsonResponse
对象将状态代码作为第二个参数,因此您应该将状态代码添加到代码中,而不是在代码中添加http_response_code
。
此外,不是将success
默认为true
,而是将其默认为false
更有意义,然后成功更新。
你可以这样做..
public function addFabAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$response['success'] = false;
$status = null;
if ($request->isXmlHttpRequest()) {
$entity = new Entity();
$form = $this->createForm(new EntityForm(), $entity);
$form->handleRequest($request);
if ($form->isValid()) {
try {
$em->persist($entity);
$em->flush();
$response['entities'] = array();
$dataResponse = array();
$dataResponse['colOne'] = $entity->getColumnOne();
$dataResponse['colTwo'] = $entity->getColumnTwo();
$response['entities'][] = $dataResponse;
$response['success'] = true;
} catch (Exception $ex) {
$status = 400; // Your error code
$response['error_message'] = 'something';
}
} else {
$status = 400;
$response['error_message'] = 'form not valid';
}
return new JsonResponse($response, $status ?: 200);
}
}
如果请求不是XmlHttpRequest
,但您可以在其他地方处理,但是您没有回应。显然。
答案 2 :(得分:0)
如果我在这里遗漏了一些东西,我不会感到惊讶,因为我不使用$ .post,我确实使用$ .ajax,我猜这几乎是一样的。如果我在这里,.fail是服务器响应时出现IIS错误,不应该用于表单验证。这应该在你的应用程序逻辑中完成,这将使得在.done中处理它是正确的。如果我需要在没有细节的情况下返回否定回复,那么我会返回&#34; false&#34;否则填充json结果。