Yii2 RESTful API如何生成带嵌套结构的自定义XML响应
实现嵌套结构的XML响应
要生成你需要的嵌套XML结构,我们可以通过调整fields()方法的返回逻辑,再配合修改XML响应格式化器的根节点配置来实现,具体步骤如下:
步骤1:在fields()中构造嵌套字段组
Yii的REST序列化器会自动将数组的层级结构映射为XML的嵌套元素,所以我们可以把相关字段分组到嵌套数组里:
public function fields() { return [ // 第一组:object_information 嵌套元素 'object_information' => function ($model) { return [ 'title' => $model->title, 'description' => $model->description, ]; }, // 第二组:geo 嵌套元素 'geo' => function ($model) { return [ 'street' => $model->street, 'postalcode' => $model->postalcode, 'city' => $model->city, ]; }, // 单独的url字段 'url' => function () { return 'https://someurl.com/'; }, ]; }
步骤2:修改XML响应的根节点
默认情况下,Yii的XML响应根节点是<response>,我们需要把它改成<real_estate>。你可以在控制器的behaviors()方法中配置内容协商行为:
public function behaviors() { $behaviors = parent::behaviors(); // 覆盖XML格式化器的根节点设置 $behaviors['contentNegotiator']['formats']['application/xml'] = [ 'class' => 'yii\web\XmlResponseFormatter', 'rootTag' => 'real_estate', ]; return $behaviors; }
最终效果
完成以上配置后,你的接口返回的XML就会完全符合需求:
<real_estate> <object_information> <title>The title</title> <description>Some text</description> </object_information> <geo> <street>Streetname</street> <postalcode>Postalcode</postalcode> <city>City</city> </geo> <url>https://someurl.com/</url> </real_estate>
额外说明
- 确保你的控制器继承了
yii\rest\ActiveController,或者已经正确配置了contentNegotiator行为,否则XML格式化可能不会生效。 - 如果需要更复杂的XML结构(比如属性、命名空间等),可以自定义
XmlResponseFormatter的子类来扩展逻辑,但当前场景用上述方案已经足够。
内容的提问来源于stack exchange,提问作者widdy
相关产品推荐
相关产品推荐

