6

问题

我正在尝试获得 AJAX 响应,以便我可以摆弄它以使我的表单更易于使用。当我使控制器(下面的代码)返回正常响应时var_dump(),我得到了对象的输出,所以我知道查询没有错(我使用 ID 1 进行查询以进行调试)。但是,当我返回输出时json_encode(),我只会得到一个空的 JSON 文件。

视图中的 HTML 表单

<div id="content">
    <form id="myForm" action="{{path('snow_ajax')}}" method="POST" >
        Write your name here:
        <input type="text" name="name" id="name_id" value="" /><br />
        <input type="submit" value="Send" />
    </form>
</div>

同一视图中的脚本

<script type="text/javascript">
    $(document).ready(function() {

        $("#myForm").submit(function(){
            var url=$("#myForm").attr("action");

            $.post(url,{
                formName:"ajaxtest",
                other:"attributes"
            },function(data){

                if(data.responseCode==200 ){
                    alert("Got your json!");
                }
                else{
                    alert("something went wrong :(");
                }
            });
            return false;
        });
    });
</script>

响应正常的控制器(工作)

public function ajaxAction()
{

    $location = $this->getDoctrine()->getRepository('SnowFrontBundle:Location')
        ->find(1);

    $output = var_dump($location);

    return $output;
}

具有 AJAX 响应的控制器(不起作用,返回空 JSON)

public function ajaxAction()
{

    $location = $this->getDoctrine()->getRepository('SnowFrontBundle:Location')
        ->find(1);

    return new Response(json_encode($location), 200);
}

有人可以帮我吗?这让我发疯!

4

4 回答 4

5

我设法通过使用 Doctrine2 的实体管理器将结果保存在一个数组中来修复它,然后我继续将它编码为 JSON。我不确定这是否是最干净的方法(根据我的 IDE,getEntityManager() 似乎已被弃用),但它现在工作正常。

public function ajaxAction()
{
    $em = $this->getDoctrine()->getEntityManager();
    $query = $em->createQuery('SELECT l FROM Snow\FrontBundle\Entity\Location l WHERE l.id=:id');
    $query->setParameter('id', 1);
    $result = $query->getArrayResult();

    return new Response(json_encode($result), 200);
}
于 2013-01-19T11:55:09.883 回答
2

发生这种情况是因为json_encode()不知道如何将对象(除了StdClass)序列化为 JSON。至少有两种方法可以解决这个问题:

  1. 如果您使用的是 PHP 5.4 或更高版本,则可以让您的对象实现JsonSerializable,当您调用对象时 PHP 将使用json_encode()该对象。
  2. 如果您使用的是 PHP 5.3 或更早版本,则可以使用 Symfony 的Serializer组件通过多种不同的方法将对象转换为 JSON。我不会解释具体怎么做,因为文档很清楚。
于 2013-03-07T05:10:34.073 回答
-1

代码示例:

$entity = // Get some entity
$result = array(
    'id' => $entity->getId(),
    'name' => $entity->getName()
);

return new Response(json_encode($result));
于 2013-01-20T08:03:40.810 回答
-1

如果要取回数据,则必须使用查询存储库 (dsl) 并在$query变量上使用该getArrayResult()方法。这使您可以直接获取数组。

于 2015-10-20T05:42:30.587 回答