Различные форматы вывода данных ответа в 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/json
FORMAT_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 }]