2016-02-17 31 views
0

我正在用Yii2構建一個REST API。通常情況下,請求響應看起來是這樣的:如何覆蓋Yii2中的REST序列化程序?

{ 
    "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」數組中的字段,而不是包含在陣列的根,即相同的水平「項目「和」_links「。我如何以及在哪裏做到這一點?

謝謝。

回答

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

謝謝。這工作完美。爲了完成答案,我將新的MySerializer類放入application/components文件夾,然後放入MyController類中: 'class'=>'app \ components \ MySerializer', – Littlebob