Правильный способ вернуть JSON в контроллер Yii2 - PullRequest
0 голосов
/ 13 сентября 2018

Я искал ответ по Интернету и обсуждал со своими партнерами, но все еще не был уверен в том, что лучше всего вернуть json в контроллер yii2.Вот варианты:

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, или если некоторые вызовы являются асинхронными, возможно, второй вариант является лучшим, потому что остановите эжекцию.Я надеюсь, что кто-то может объяснить разницу в достоинствах и недостатках каждого метода

Ответы [ 2 ]

0 голосов
/ 26 июля 2019
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,
        ];
    }

}
0 голосов
/ 13 сентября 2018

Контроллер имеет специальную комбинацию для этого - 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.

...