2016-06-29 81 views
0

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

回答

2

+0

小優化:可以使用'Response :: FORMAT_XML'來代替''xml''。 – robsch

+0

對..嘿嘿.. –

-1

一種方法是爲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中)。如果你想改變針對特定行動格式然後用

'components' => [ 
    'response' => [ 
     'formatters' => [ 
      'xml' => [ 
       'class' => 'yii\web\XmlResponseFormatter', 
       'rootTag' => 'data', 
      ], 
     ], 
    ], 
], 
+0

爲什麼downvote?有問題? – robsch

0

如果要修改XML響應格式化您的所有應用程序,你應該簡單地添加到您的配置文件。

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'] 
    ];