YII 進階 數據提供器

yii 提供了兩種數據提供器 ActiveDataProvider和SqlDataProvider
使用方法也是非常簡單 具體可查詢官方文檔

        $model =  new ActiveDataProvider(['query'=>$query]);
        $result = new SqlDataProvider(['sql'=>$sql ]);

效果如下
在這裏插入圖片描述
如果當前數據模式滿足不了我們的業務需求怎麼增加返回字段

  1. 接口拆分寫兩個接口
  2. 更改Yii代碼進行多字段返回(如我們統一返回info字段)
首先建立base層(繼承)
// ActiveDataProvider.php
class ActiveDataProvider extends \yii\data\ActiveDataProvider
{
   public $info;
}
//SqlDataProvider.php
class SqlDataProvider extends \yii\data\SqlDataProvider
{
   public $info;
}
//MySerializer.php 改文件可在base控制器中使用
//public $serializer = [
//        'class' => '\base\MySerializer',
//        'collectionEnvelope' => 'data',
//    ];
//也可在需要返回改格式的控制器中使用
<?php

namespace backend\modules\v2\base;

class MySerializer extends \yii\rest\Serializer
{
   /**
    * 應app端要求,重寫serializeDataProvider方法,加上code=1
    * @param \yii\data\DataProviderInterface $dataProvider
    * @return array|null
    */
   protected function serializeDataProvider($dataProvider)
   {
       if ($this->preserveKeys) {
           $models = $dataProvider->getModels();
       } else {
           $models = array_values($dataProvider->getModels());
       }
       $models = $this->serializeModels($models);

       if (($pagination = $dataProvider->getPagination()) !== false) {
           $this->addPaginationHeaders($pagination);
       }

       if ($this->request->getIsHead()) {
           return null;
       } elseif ($this->collectionEnvelope === null) {
           return $models;
       }

       $result = [
           'code' => 1,
           $this->collectionEnvelope => $models,
       ];
       if(isset($dataProvider->info)) $result['info'] = $dataProvider->info;//自定義增加返回條件
       if ($pagination !== false) {
           return array_merge($result, $this->serializePagination($pagination));
       }

       return $result;
   }
 
}

然後效果數據如下
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章