2010-06-01 31 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);