在一个动作中,我需要用一些XML来回应。我使用Response::FORMAT_XML
,这很好。
// In a controller:
public static function actionFetchData() {
Yii::$app->response->format = Response::FORMAT_XML;
return [
'a' => 'b',
['c', 'd'],
'e' => ['f', 'g']
];
}
浏览器中的结果:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<a>b</a>
<item>
<item>c</item>
<item>d</item>
</item>
<e>
<item>f</item>
<item>g</item>
</e>
</response>
但是,我想将根标记名称从响应更改为数据。这应该是可能的,因为用于呈现XML的XmlResponseFormatter具有属性rootTag。我怎样才能做到这一点?
或者一般来说:如何更改格式化程序(也是JSON或其他)的设置?
答案 0 :(得分:2)
如果要更改特定操作的格式,请使用:。
Yii::$app->response->format = Response::FORMAT_XML;
Yii::$app->response->formatters = [
'xml' => [
'class' => 'yii\web\XmlResponseFormatter',
'rootTag' => 'data',
],
];
return [
'a' => 'b',
['c', 'd'],
'e' => ['f', 'g']
];
答案 1 :(得分:0)
一种方法是为XML创建自己的格式化程序对象。原因:在Yii::$app->response
中,formmatter不在操作中 - 它将在稍后创建,当响应被呈现时,修改它为时已晚。但是我们可以创建一个新的格式化程序并将其设置为XML的格式化程序。这是一个有效的选择。
public static function actionMetaInfo($docId) {
$formatter = new XmlResponseFormatter([
'rootTag' => 'data',
'itemTag' => 'unnamed',
]);
Yii::$app->response->formatters[Response::FORMAT_XML] = $formatter;
Yii::$app->response->format = Response::FORMAT_XML;
return [
'a' => 'b',
['c', 'd'],
'e' => ['f', 'g']
];
}
立即输出:
<?xml version="1.0" encoding="UTF-8"?>
<data>
<a>b</a>
<unnamed>
<unnamed>c</unnamed>
<unnamed>d</unnamed>
</unnamed>
<e>
<unnamed>f</unnamed>
<unnamed>g</unnamed>
</e>
</data>
我在这里也更改了itemTag。这样,我们也可以修改其他Formatter属性(例如也可以在JsonResponseFormatter中)。
答案 2 :(得分:0)
如果要修改所有应用程序的XML响应格式化程序,只需将其添加到配置文件中即可:
'components' => [
'response' => [
'formatters' => [
'xml' => [
'class' => 'yii\web\XmlResponseFormatter',
'rootTag' => 'data',
],
],
],
],