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,而变量不为空的主要内容,如果未能解决你的问题,请参考以下文章
在对 WebMethod 的 jQuery AJAX 调用中获取空响应,但 Web 方法返回 JSON