Symfony2 在 AJAX 调用中返回空 JSON,而变量不为空

Posted

技术标签:

【中文标题】Symfony2 在 AJAX 调用中返回空 JSON,而变量不为空【英文标题】:Symfony2 returns empty JSON on AJAX call while variable isn't empty 【发布时间】:2013-01-03 01:12:18 【问题描述】:

问题

我正在尝试获取 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);

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

【问题讨论】:

【参考方案1】:

我设法通过使用 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);

【讨论】:

json_encode() 需要一个关联数组。你不能直接编码实体。如果要对实体进行编码,可以使用 JMS Serializer Bundle。我只想创建一个包含您要编码的值的数组(因为它可能不是实体的所有属性)【参考方案2】:

代码示例:

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

return new Response(json_encode($result));

【讨论】:

【参考方案3】:

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

    如果您使用的是 php 5.4 或更高版本,您可以让您的对象实现 JsonSerializable,当您在对象上调用 json_encode() 时,PHP 将使用它。 如果您使用的是 PHP 5.3 或更早版本,则可以使用 Symfony 的 Serializer 组件通过多种不同的方法将对象转换为 JSON。我不会解释具体怎么做,因为文档很清楚。

【讨论】:

【参考方案4】:

如果您想取回数据,您必须使用查询存储库 (dsl) 并在您的 $query 变量上使用 getArrayResult() 方法。这允许您直接获取一个数组。

【讨论】:

以上是关于Symfony2 在 AJAX 调用中返回空 JSON,而变量不为空的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2,检查一个动作是不是被ajax调用

symfony2 上的 AJAX 跨域

在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON

Ajax.BeginForm,调用操作,返回 JSON,如何在 OnSuccess JS 函数中访问 JSON 对象?

symfony2 安全 - 禁用登录路径并显示禁止

bug日记之---------js中调用另一个js中的有ajax的方法, 返回值为undefind