如何修改响应格式本身?

时间:2016-06-29 12:19:44

标签: yii2 response formatter

在一个动作中,我需要用一些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或其他)的设置?

3 个答案:

答案 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',
            ],
        ],
    ],
],