2011-12-19 89 views
4

始终得到了一个空白,我有这样的内容长度:0的JSON响应的Symfony2

/** 
* @Route("/check/{key}.json", defaults={"_format"="json"}) 
* @Template() 
*/ 
public function processAction($upload_key) 
{ 
    /* make thing */ 
    return array('data' => $process_data); 
} 

在我的控制器中的动作在我process.json.twig文件我有

{% set res = { 'data': data } %} 
{{ res | json_enconde | raw }} 

其他形式

{{ { 'data': data } | json_enconde | raw }} 

我已经尝试过这样:

{{ 'hello' | json_encode | raw }} 

铬我得到这样的响应:

Connection:close 
Content-Length:0 
Content-Type:application/json 
Date:Mon, 19 Dec 2011 05:13:17 GMT 
Server:Apache/2.2.20 (Ubuntu) 
X-Powered-By:PHP/5.3.6-13ubuntu3.3 

,并从服务器得到什么,我不能解决这个

回答

5

有两种方法来实现这一目标,这取决于您的喜好以及是否或者不是你的行为应该支持多个_format类型。

选项A - 只有返回JSON

您可以完全绕过该模板的操作。

在你的控制器中删除@Template注释,而是return new Response(json_encode($process_data));

选项B - 支持不同格式的动作,或者你只是想呈现JSON在模板

通过呈现不同的动作格式我指的是一个动作与路由如此:

@Route("/check/{key}.{_format}", defaults={"_format"="json"} 
@Template 

虽然在这个问题的控制器沿着“一个只支持JSON,但你想在模板中渲染它“。

假设控制器的processAction返回return array('data' => $process_data);的问题问那么渲染这是JSON一个名为process.json.twig模板内应做如下{{ data|json_encode }},没有必要预先处理data或把它变成另一个数组或类似的东西在模板内。

+0

是真的你解决方案的工作,但是一个错误? – rkmax 2011-12-19 14:24:36

+0

@rkmax:不,我不会说这是一个错误。无论如何,只要将JSON数据作为来自控制器的响应返回,效率更高,因为Symfony不需要进行模板化阶段。我不确定为什么它根本没有调用模板,但是它可能知道什么时候'_format =“json”'它应该只将内容类型设置为'application/json'并且期望响应中有适当的数据。 – Kasheen 2011-12-19 19:51:10

+0

无论如何,因为我有疑问,我已经报告错误,看看他们告诉我什么 – rkmax 2011-12-19 20:18:56