2010-05-13 89 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

相关问题