You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:18:00