YII 进阶 数据提供器

8 篇文章 0 订阅
本文介绍如何在Yii框架中扩展ActiveDataProvider和SqlDataProvider,通过自定义返回字段增强数据提供器的功能,实现统一的info字段返回,并重写serializeDataProvider方法以满足特定的数据格式需求。
摘要由CSDN通过智能技术生成

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;
   }
 
}

然后效果数据如下
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值