【问题标题】:Right way to return json in Yii2 controller在 Yii2 控制器中返回 json 的正确方法
【发布时间】:2018-09-13 14:17:45
【问题描述】:

我在互联网上寻找答案并与我的合作伙伴讨论过,但仍然不确定在 yii2 控制器中返回 json 的最佳选择。这里有选项:

public function actionExample (){//1
    // do something whit $data result ...
    \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
    return $data;
}


public function actionExample (){//2
    // do something whit $data result ...
     echo json_encode($data);

    Yii::$app->end();
}

我认为第一个选项是最好的(更优雅),例如 RESTful 控制器。但是,如果我不确定对控制器的所有调用是否都可以接收 json,或者如果某些调用是异步的,那么第二个选项可能是最好的,因为停止喷射。我希望有人可以解释每种方法的不同优缺点

【问题讨论】:

    标签: php json controller yii2 response


    【解决方案1】:

    控制器为此提供了专用快捷方式 - asJson():

    return $this->asJson($data);
    

    但这对于

    来说是等价的
    $response = Yii::$app->getResponse();
    $response->format = Response::FORMAT_JSON;
    $response->data = $data;
    return $response;
    

    Yii::$app->response->format = Response::FORMAT_JSON;
    return $data;
    

    所以这三个选项的效果是一样的。


    public function actionExample (){//2
        // do something whit $data result ...
         echo json_encode($data);
    
        Yii::$app->end();
    }
    

    这是不正确的 - 你不应该在控制器中回显,它可能会在最新版本的 Yii2 中抛出异常。它也不会使用正确的 Content-Type 标头,因此客户端可能会将结果视为 text/html 而不是 JSON。

    【讨论】:

      【解决方案2】:
      namespace app\controllers;
      
      use Yii;
      use yii\web\Controller;
      use yii\web\Response;
      
      class ResponseController extends Controller
      {
          private $data = array('a', 'b', 'c', 'd', 'e', 'f');
      
          public function actionResponseJson()
          {
              Yii::$app->response->format = Response::FORMAT_JSON;
              return [
                  'data' => $this->data,
              ];
          }
      
          public function actionResponseXml()
          {
              Yii::$app->response->format = Response::FORMAT_XML;
              return [
                  'data' => $this->data,
              ];
          }
      
      }
      

      【讨论】:

      • 能否给你的代码添加一些解释,好吗? 如何为什么这为OP的问题提供了答案。谢谢。
      • Yii::$app->response->format = Response::FORMAT_JSON;header('Content-Type: application/json'); echo json_encode($data); 这样的代码在 PHP 上显示完整的 JSON 格式输出,对于 Yii::$app->response->format = Response::FORMAT_XML;echo sendResponse($type,$cause); header("Content-type: text/xml; charset=utf-8"); 在 PHP 上显示 XML 格式
      猜你喜欢
      • 2021-05-17
      • 2011-08-19
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多