2010-05-13 91 views

回答

82

在(基地)控制器創建此功能:

/** 
* Return data to browser as JSON and end application. 
* @param array $data 
*/ 
protected function renderJSON($data) 
{ 
    header('Content-type: application/json'); 
    echo CJSON::encode($data); 

    foreach (Yii::app()->log->routes as $route) { 
     if($route instanceof CWebLogRoute) { 
      $route->enabled = false; // disable any weblogroutes 
     } 
    } 
    Yii::app()->end(); 
} 

然後只需在動作結束致電:

$this->renderJSON($yourData); 
+0

我注意到設置** header()**或** Yii :: app() - > end(); **沒有任何區別。在Chrome開發者工具中,如果您注意到**標題**選項卡下的**響應標題**,則它們都會提供相同的內容長度。如果ajax已經以「json」格式輸出,那麼即使發送了HTML,瀏覽器/ jQuery也會將該響應視爲json。它似乎適用於所有現代瀏覽器。雖然,我不否認設置標題()是一件好事。 – mohitp 2013-03-02 08:31:21

+0

而不是禁用Web日誌路由,這種方法將更強大(尚未測試): ~~~ ob_start(); Yii :: app() - > end(0,false); ob_end_clean(); exit(0); – marcovtwout 2013-03-14 09:34:42

9
$this->layout=false; 
header('Content-type: application/json'); 
echo json_encode($arr); 
Yii::app()->end(); 
+0

json_encode不適用於模型 – 2010-12-18 00:25:06

+4

幾個tewaks:對模型使用CJSON :: encode();因爲'Yii :: app() - > end()'將終止應用程序而不輸出佈局,所以不需要執行'$ this-> layout = false'。 – Ethan 2011-07-21 02:07:22

+0

我認爲你最好改變@marcovtwout的最佳答案 – 2014-04-02 18:21:11

19
$this->layout=false; 
header('Content-type: application/json'); 
echo CJavaScript::jsonEncode($arr); 
Yii::app()->end(); 
+0

也不要忘記在調用Yii :: app() - > end()之前禁用WebLogRoutes,否則調試信息可能會附加到你的json中並可能使其無效。 – marcovtwout 2012-10-15 15:20:24

+0

很確定end()關閉日誌,這就是爲什麼我在這裏添加它 – 2012-10-15 18:37:28

+1

它不。 end():「終止應用程序,該方法在退出之前通過調用onEndRequest函數替換PHP的exit()函數。」並且在CLogRouter(http://www.yiiframework.com/doc/api/1.1/CLogRouter#processLogs-detail)中:「此方法是CApplication :: onEndRequest事件的事件處理程序。」 – marcovtwout 2012-10-23 13:14:10

-1
Yii::app()->end() 

我覺得這個解決方案是不結束應用程序流的最好方式,因爲它使用PHP的exit()功能,女巫指執行流立即退出。是的,Yii的onEndRequest處理程序和PHP的register_shutdown_function,但它仍然過於宿命。

對我來說,更好的辦法是這樣的

public function run($actionID) 
{ 
    try 
    { 
     return parent::run($actionID); 
    } 
    catch(FinishOutputException $e) 
    { 
     return; 
    } 
} 

public function actionHello() 
{ 
    $this->layout=false; 
    header('Content-type: application/json'); 
    echo CJavaScript::jsonEncode($arr); 
    throw new FinishOutputException; 
} 

因此,應用程序流繼續即使後執行。

+0

如果你已經把layout = false,一個簡單的'return'會做什麼?甚至可以省略。我沒有理由嘗試/捕捉並創建自定義異常。 – marcovtwout 2012-10-15 15:23:46

+1

這真是太糟糕了。拋出一個異常來輸出響應。 – grantwparks 2014-08-25 15:44:30

+0

現在,過了一段時間我完全同意使用異常來管理控制器/表示邏輯是錯誤的。 – Mihailoff 2014-08-25 22:18:44

0

一個更簡單的方法,通過使用

echo CJSON::encode($result); 

示例代碼:

public function actionSearch(){ 
    if (Yii::app()->request->isAjaxRequest && isset($_POST['term'])) { 
      $models = Model::model()->searchNames($_POST['term']); 
      $result = array(); 
      foreach($models as $m){ 
       $result[] = array(
         'name' => $m->name, 
         'id' => $m->id, 
       ); 


      } 
      echo CJSON::encode($result); 
     } 
} 

歡呼:)

5
class JsonController extends CController { 

    protected $jsonData; 

    protected function beforeAction($action) { 
     ob_clean(); // clear output buffer to avoid rendering anything else 
     header('Content-type: application/json'); // set content type header as json 
     return parent::beforeAction($action); 
    } 

    protected function afterAction($action) { 
     parent::afterAction($action); 
     exit(json_encode($this->jsonData)); // exit with rendering json data 
    } 

} 

class ApiController extends JsonController { 

    public function actionIndex() { 
     $this->jsonData = array('test'); 
    } 

} 
0

在控制器的行動,要呈現JSON數據,例如:actionJson()

public function actionJson(){ 
    $this->layout=false; 
    header('Content-type: application/json'); 
    echo CJSON::encode($data); 
    Yii::app()->end(); // equal to die() or exit() function 
} 

查看更多Yii API

10

對於Yii2控制器內:

public function actionSomeAjax() { 
    $returnData = ['someData' => 'I am data', 'someAnotherData' => 'I am another data']; 

    $response = Yii::$app->response; 
    $response->format = \yii\web\Response::FORMAT_JSON; 
    $response->data = $returnData; 

    return $response; 
} 
+2

這應該是被接受的答案。跟隨Yii的api +1。 – Gogol 2015-12-07 07:21:00

+0

謝謝先生!^- ^ – 2016-11-22 02:40:49

相關問題