Правильный способ вернуть json в контроллере Yii2

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
3 436
2

Ответы 2

В контроллере есть специальный ярлык для этого - 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,
        ];
    }

}

Не могли бы вы добавить пояснения к вашему коду, пожалуйста? Как и Почему дают ответ на вопрос OP. Спасибо.

deHaar 26.07.2019 07:49
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.
Arbahud Rio Daroyni 26.07.2019 09:55

Другие вопросы по теме