如何在yii中获得响应为json格式(application / json)?

如何在yii中获得响应为json格式(application / json)?

在你的(base)控制器中创build这个function:

/** * 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); 
 $this->layout=false; header('Content-type: application/json'); echo CJavaScript::jsonEncode($arr); Yii::app()->end(); 

对于控制器内的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; } 
 $this->layout=false; header('Content-type: application/json'); echo json_encode($arr); Yii::app()->end(); 
 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'); } } 

使用一个更简单的方法

 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); } } 

欢呼:)

在你想渲染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

 Yii::app()->end() 

我认为这个解决scheme不是结束应用程序stream程的最好方法,因为它使用PHP的exit()函数,这意味着立即退出执行stream程。 是的,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; } 

所以,应用程序stream程继续执行后,甚至之后。