2016-06-29 16 views
0

In einer Aktion muss ich mit etwas XML antworten. Ich benutze dafür Response::FORMAT_XML, was gut funktioniert.Wie kann ich die Antwortformatierung selbst ändern?

// In a controller: 

public static function actionFetchData() { 
    Yii::$app->response->format = Response::FORMAT_XML; 

    return [ 
     'a' => 'b', 
     ['c', 'd'], 
     'e' => ['f', 'g'] 
    ]; 
} 

Ergebnis in Browser:

<?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> 

Allerdings würde Ich mag die Wurzel-Tags Name von Antwort-Daten ändern. Dies sollte möglich sein, da XmlResponseFormatter, das zum Rendern des XML verwendet wird, die Eigenschaft rootTag hat. Wie kann ich das machen?

Oder allgemein: Wie kann ich die Einstellungen eines Formatierungsprogramms (auch JSON oder was auch immer) ändern?

Antwort

2

Wenn Sie Format spezifisch für bestimmte Aktion ändern wollen, dann benutzen.

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

Kleine Optimierung: 'Response :: FORMAT_XML' könnte anstelle von''xml'' verwendet werden. – robsch

+0

richtig .... hehe .. –

-1

Eine Möglichkeit besteht darin, ein eigenes Formatierungsobjekt für XML zu erstellen. Grund: In Yii::$app->response ist das Formmatter nicht innerhalb der Aktion vorhanden - es wird später erstellt, wenn die Antwort gerendert wird, was es zu spät ist, es zu ändern. Aber wir können einen neuen Formatierer erstellen und ihn als Formatierer für XML festlegen. Dies ist eine gültige Option.

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

Ausgabe jetzt:

<?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> 

Hier änderte ich den ItemTag auch. Auf diese Weise können wir auch die Eigenschaften eines anderen Formatierers ändern (z. B. auch in JsonResponseFormatter).

+0

Warum runter? Etwas stimmt nicht? – robsch

0

Wenn Sie XML-Antwortformatierer für Ihre Anwendung ändern möchten, sollten Sie einfach diese Datei zu Ihrer Konfiguration hinzuzufügen:

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