Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

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

Различные форматы вывода данных ответа в 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
}]
  • 2015-12-29 00:13:10