2010-06-01 70 views

回答

38

如果它只是你从它返回一个正常的AJAX动作,我想我已经用下面的某处过去:

return $this->renderText(json_encode($something)); 
+8

如果你有网络调试酒吧活跃在开发者模式,你必须添加行“sfConfig ::集(‘sf_web_debug’,虚假);” – chiborg 2010-12-19 16:06:00

+6

这将在响应主体返回JSON,但内容类型将是text/html的。添加'$这个 - > GETRESPONSE() - >的setContentType( '应用/ JSON');' – ilanco 2012-07-10 17:27:06

17

的廉价的方式:

function executeSomethingThatReturnsJson(){ 
    $M = new Model(); 
    $stuff = $M->getStuff(); 
    echo json_encode($stuff); 
    die(); //don't do any view stuff 
} 

更聪明的方式:

一个更聪明的方法是创建sfActions这有助于处理JSON的东西的一个很好的子类。

在一个项目我最近,我创建了一个名为 'API'(./symfony generate:application api

应用程序,然后创建一个类似文件:

API/lib中/ apiActions.class.php

<?PHP 
class apiActions extends sfActions { 
    public function returnJson($data){ 
    $this->data = $data; 
    if (sfConfig::get('sf_environment') == 'dev' && !$this->getRequest()->isXmlHttpRequest()){ 
     $this->setLayout('json_debug'); 
     $this->setTemplate('json_debug','main'); 
    }else{ 
     $this->getResponse()->setHttpHeader('Content-type','application/json'); 
     $this->setLayout('json'); 
     $this->setTemplate('json','main'); 
    } 
    } 
} 

请注意,我明确设置的模板在那里。

所以我jsonSuccess.php模板就是:

<?PHP echo json_encode($data); 

虽然json_debugSuccess.php使事情变得更漂亮:

<?PHP var_dump($data); ?> 

然后你就可以拥有一个扩展apiActions(而不是通常的sfActions控制器)看起来像这样:

<?php 
class myActions extends apiAction { 
    public function executeList(sfWebRequest $request) 
    { 
    $params = array(); 
    if ($request->hasParameter('id')){ 
     $id = $request->getParameter('id'); 
     if (is_numeric($id)){ 
     $params['id'] = $id; 
     } 
    } 
    $data = Doctrine::getTable('SomeTable')->findAll(); 
    $this->returnJson($data); 
    } 
} 

声明:上面的代码是复制/粘贴出我的应用程序,但简化。这只是为了说明的目的 - 但它应该让你朝着正确的方向前进。

+0

这真的很有趣:)ü张贴了大量的代码,但之前的回答是一条线,它的工作:) 1+ü是渴望帮助虽然:) – 2010-06-01 22:43:06

+6

右键 - !其他答案是一个更好的版本“廉价的方式”。我的答案的其余部分是基于环境来处理不同的事情,但我相信它可以做得更干净。 – timdev 2010-06-01 22:59:01

4

FYI:在Symfony的2.X的情况下,“快速,脏“的方式如下所示:

return new Response(json_encode($data), 200, array('Content-Type', 'text/json')); 
+1

我想你甚至可以只是把'响应(json_encode($数据))'如果你的路由规定好的格式('默认: {_controller:your:action,_format:json}') – 2012-09-12 13:15:58

0

返回新的JsonResponse(array);