如何在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程继续执行后,甚至之后。