我的函数返回Ajax请求应该通过.fail()回调?

时间:2014-10-27 02:28:05

标签: javascript php jquery ajax symfony

我在视图中通过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返回异常,那么我现在不知道其他任何建议吗?最好的方法是什么?

3 个答案:

答案 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结果。