Различные форматы вывода данных ответа в Yii2 через Response

Чаще всего, в веб-приложениях требуется возвращать контент в виде html, но, при необходимости, в yii framework 2 существует возможность отдавать данные практически в любом виде. Например, в JSON или XML.
За вывод данных в Yii2 отвечает класс yii\web\Response. Именно он преобразует данные (которые возвращаются через return в контроллере) в заданный формат. Получить доступ к этому компоненту можно через Yii::$app->response.
По умолчанию Yii::$app->response->format имеет значение yii\web\Response::FORMAT_HTML, но поддерживаются также и другие
FORMAT_RAW- данные возвращаются без какого-либо преобразования. При этом никакие дополнительные HTTP заголовки не добавляются. Работая с этим форматом, вас ни что не ограничивает и можно настроить абсолютно любой формат вывода и заголовкиFORMAT_JSON- данные преобразуются в форматJSON, а Content-Type установится вapplication/jsonFORMAT_JSONP- преобразование осуществится вJSONP, Content-Type будет установлен вtext/javascript. Важно заметить, что в данном случае могут возвращаться не только данные, но и callback элементыFORMAT_XML- данные будут сконвертированы вXMLс выставлением соответствующего заголовка. Дополнительная настройка данного формата осуществляется с помощьюyii\web\XmlResponseFormatter
Разберем как это работает на примере FORMAT_XML.
public function actionIndex()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_XML;
$items = [
[
'id' => '1',
'name' => 'Product 1',
'proce' => 123,
],
[
'id' => '2',
'name' => 'Product 2',
'proce' => 321,
],
[
'id' => '5',
'name' => 'Product 5',
'proce' => 500,
],
];
return $items;
}
Результатом работы данного экшена будет xml-ка следующего вида:
<response> <item> <id>1</id> <name>Product 1</name> <proce>123</proce> </item> <item> <id>2</id> <name>Product 2</name> <proce>321</proce> </item> <item> <id>5</id> <name>Product 5</name> <proce>500</proce> </item> </response>
Таким же образом можно вернуть любой объект, который реализует интерфейс Arrayable или имеет метод __toString(), а в Yii framework 2 - это любая унаследованная модель от yii\base\Model. Например, реализация вывода данных выборки из БД через ActiveRecord в JSON реализуется буквально в несколько строк кода:
public function actionIndex()
{
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON;
$products = Product::find()->where(['id' => [1, 2, 5]])->all();
return $products;
}
На выходе получится валидный json:
[{
"id": 1,
"name": "Product 1",
"price": 123
}, {
"id": 2,
"name": "Product 2",
"price": 321
}, {
"id": 5,
"name": "Product 5",
"price": 500
}]
