在Symfony 2中接收json响应

时间:2014-02-03 00:26:05

标签: jquery ajax json symfony

我在search.html.twig页面上有一个javascript事件监听器,它将触发ajax请求。在下面的示例中,我的目标是使ajax调用成功,以便执行alert()消息。

我习惯了扁平的PHP方法:

echo json_encode($myAry);

Symfony的路由系统使得对jjax的json响应变得混乱。我目前收到内部服务器错误500。

我很感激有关如何解决这个问题的任何建议。预先感谢!

DefaultController

     public function showCompanyAction($id)
    {
        $repository = $this->getDoctrine()->getRepository('TestBundle:Company');
        //get company based on id

        //prepare json object

        //return it to search.html.twig
        return new JsonResponse(array('name' => 'hello'));  
    }

JQuery(search.html.twig)

{% block jquery %} 
    <script>
        $(function(){


            $.ajax({
                type: "POST",
                url: "../company/booth/2",
                dataType: 'json',
                success: function(msg){
                    alert(msg);
                }
            })
        });
    </script>

{% endblock %} 

3 个答案:

答案 0 :(得分:4)

Jivan的答案很好,这是一个更易于维护的替代方案:

use Symfony\Component\HttpFoundation\JsonResponse;

class YourController
{
    public function yourAction()
    {
        $response = new JsonResponse();
        $response->setData(array('message' => 'hello'));

        return $response;
    }
}

使用此解决方案,您无需对数组进行编码并指定响应标头(Content-Type和所有)。如果JSON响应的特异性发生变化,那么您就不必担心更新代码了。

答案 1 :(得分:2)

要在Symfony2中返回json响应,您必须从为company/booth/2定义的路由调用的控制器中返回此响应:

use Symfony\Component\HttpFoundation\Response;

class YourController
{
    public function YourAction()
    {
        $response = json_encode(array('message' => 'hello'));

        return new Response($response, 200, array(
            'Content-Type' => 'application/json'
        ));
    }
}

回复中的200Http Status Code。 200表示“请求已完成”。

答案 2 :(得分:0)

要使用jQuery处理JsonResponse,您可以使用“each”函数执行此操作:

public function showCompanyAction($id)
{
    return new JsonResponse(
        array(
            array('name' => 'hello'),
            array('name' => 'bye'),
        )
    );  
}

{% block jquery %} 
<script>
    $(function() {
        $.ajax({
            type: "POST",
            url: "../company/booth/2",
            dataType: 'json',
            success: function(data) {
                $.each(data, function (index, element) {
                    alert(element.name);
                });
            }
        })
    });
</script>
{% endblock %}