2016-06-29 5 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

あなたが特定のアクションに固有の形式を変更したい場合は、使用します。

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

小さなopimization: '' xml''の代わりに 'Response :: FORMAT_XML'を使うことができました。 – robsch

+0

右.... hehe .. –

-1

1つの方法は、XML用の独自のフォーマッタオブジェクトを作成することです。理由:Yii::$app->responseでは、フォームマターはアクション内に存在しません。レスポンスがレンダリングされると後で作成されますが、それを修正するには遅すぎます。しかし、新しいフォーマッタを作成し、それを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)。

+0

なぜdownvoteですか?何か問題でも? – robsch

0

すべてのあなたのアプリケーションのためのXML応答フォーマッタを変更したい場合、あなたは、単にあなたの設定ファイルにこれを追加する必要がありますが:

'components' => [ 
    'response' => [ 
     'formatters' => [ 
      'xml' => [ 
       'class' => 'yii\web\XmlResponseFormatter', 
       'rootTag' => 'data', 
      ], 
     ], 
    ], 
], 
関連する問題