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






В контроллере есть специальный ярлык для этого - 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.
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,
];
}
}
Yii::$app->response->format = Response::FORMAT_JSON; этот код, например header('Content-Type: application/json'); echo json_encode($data);, для отображения вывода полного формата JSON на PHP и для Yii::$app->response->format = Response::FORMAT_XML;, например echo sendResponse($type,$cause); header("Content-type: text/xml; charset=utf-8");, для отображения формата XML на PHP.
Не могли бы вы добавить пояснения к вашему коду, пожалуйста? Как и Почему дают ответ на вопрос OP. Спасибо.