如何在Yii2中覆盖REST序列化程序?

时间:2016-02-17 10:17:19

标签: php api rest yii2

我正在使用Yii2构建REST API。通常,请求响应看起来像这样:

    {
    "items": [
        {
            "id": 1,
            ...
        },
        {
            "id": 2,
            ...
        },
        ...
    ],
    "_links": {
        "self": {
            "href": "http://localhost/users?page=1"
        },
        "next": {
            "href": "http://localhost/users?page=2"
        },
        "last": {
            "href": "http://localhost/users?page=50"
        }
    },
    "_meta": {
        "totalCount": 1000,
        "pageCount": 50,
        "currentPage": 1,
        "perPage": 20
    }
}

我想覆盖序列化程序,以便包含在" _meta"相反,数组包含在数组的根中,即与" item"相同的级别。和" _links"。我该怎么做?在哪里?

谢谢。

1 个答案:

答案 0 :(得分:1)

根据documentation您创建一个新的Serializer类。所以,基本上,你扩展yii\rest\Serializer并重写serialize()方法。然后为控制器设置自定义序列化程序。

class MySerializer extends Serializer 
{
    public function serialize($data) 
    {
        $d = parent::serialize($data);
        $m = $d['_meta'];
        unset($d['_meta']);
        return array_merge($d, $m);
    }
}

class MyController extends ActiveController
{
    public $serializer = [
        'class' => 'yii\rest\MySerializer',
        'collectionEnvelope' => 'items',
    ];
}