1、创建缓存组件的控制器类,\api\controllers\CacheComponentController.php

<?php
namespace api\controllers;

use yii\rest\ActiveController;

/**
 * Class CacheComponentController
 * @package api\controllers
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */class CacheComponentController extends ActiveController
{
    public $serializer = [
        'class' => 'api\rests\cache_component\Serializer',
        'collectionEnvelope' => 'items',
    ];

    /**
     * @inheritdoc
     */    public function actions()
    {
        $actions = parent::actions();
        // 禁用"view"、"create"、"update"、"delete"、"options"动作
        unset($actions['view'], $actions['create'], $actions['update'], $actions['delete'], $actions['options']);
        $actions['index']['class'] = 'api\rests\cache_component\IndexAction';
        return $actions;
    }
}

2、创建缓存组件的资源类的数据层(相应的模型语言包文件),\common\models\redis\CacheComponent.php

<?php

namespace common\models\redis;

use Yii;
use common\components\redis\ActiveRecord;

/**
 * This is the model class for table "{{%cache_component}}".
 *
 * @property int $id
 * @property string $name 组件ID
 */class CacheComponent extends ActiveRecord
{
    /**
     * @return array the list of attributes for this record
     */    public function attributes()
    {
        return ['id', 'name'];
    }

    /**
     * @inheritdoc
     */    public function rules()
    {
        return [
            [['id', 'name'], 'safe'],
        ];
    }

    /**
     * @inheritdoc
     */    public function attributeLabels()
    {
        return [
            'id' => Yii::t('model/redis/cache-component', 'ID'),
            'name' => Yii::t('model/redis/cache-component', 'Name'),
        ];
    }
}

3、创建缓存组件的资源类的逻辑层,\common\logics\redis\CacheComponent.php

<?php

namespace common\logics\redis;

use Yii;

class CacheComponent extends \common\models\redis\CacheComponent
{
    /**
     * Returns array of caches in the system, keys are cache components names, values are class names.
     * @param array $cachesNames caches to be found
     * @return array
     */    function getCacheComponents(array $cachesNames = [])
    {
        $caches = [];
        $components = Yii::$app->getComponents();
        $findAll = ($cachesNames == []);

        foreach ($components as $name => $component) {
            if (!$findAll && !in_array($name, $cachesNames)) {
                continue;
            }

            if ($component instanceof Cache) {
                $caches[$name] = ['name'=>$name, 'class'=>get_class($component)];
            } elseif (is_array($component) && isset($component['class']) && $this->isCacheClass($component['class'])) {
                $caches[$name] = ['name'=>$name, 'class'=>$component['class']];
            } elseif (is_string($component) && $this->isCacheClass($component)) {
                $caches[$name] = ['name'=>$name, 'class'=>$component];
            }
        }

        return $caches;
    }

    /**
     * Checks if given class is a Cache class.
     * @param string $className class name.
     * @return boolean
     */    private function isCacheClass($className)
    {
        return is_subclass_of($className, Cache::className());
    }


}

4、在接口应用中,创建缓存组件的资源类,\api\models\redis\CacheComponent.php

<?php

namespace api\models\redis;

class CacheComponent extends \common\logics\redis\CacheComponent
{

}

5、在接口应用的v1模块中,创建缓存组件的资源类,\api\modules\v1\models\redis\CacheComponent.php

<?php

namespace api\modules\v1\models\redis;

class CacheComponent extends \api\models\redis\CacheComponent
{

}

6、在接口应用的v1模块中,创建缓存组件的控制器类,定义模型类,\api\modules\v1\controllers\CacheComponentController.php

<?php

namespace api\modules\v1\controllers;

/**
 * CacheComponent controller for the `v1` module
 */class CacheComponentController extends \api\controllers\CacheComponentController
{
    public $modelClass = 'api\modules\v1\models\redis\CacheComponent';
}

7、创建获取缓存组件列表的方法类,\api\rests\cache_component\IndexAction.php

<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
namespace api\rests\cache_component;

use Yii;
use yii\data\ArrayDataProvider;

/**
 * IndexAction implements the API endpoint for listing multiple models.
 *
 * For more details and usage information on IndexAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */class IndexAction extends \yii\rest\IndexAction
{
    /**
     * Prepares the data provider that should return the requested collection of the models.
     * @return ActiveDataProvider
     */    protected function prepareDataProvider()
    {
        $requestParams = Yii::$app->getRequest()->getBodyParams();
        if (empty($requestParams)) {
            $requestParams = Yii::$app->getRequest()->getQueryParams();
        }

        $filter = null;
        if ($this->dataFilter !== null) {
            $this->dataFilter = Yii::createObject($this->dataFilter);
            if ($this->dataFilter->load($requestParams)) {
                $filter = $this->dataFilter->build();
                if ($filter === false) {
                    return $this->dataFilter;
                }
            }
        }

        if ($this->prepareDataProvider !== null) {
            return call_user_func($this->prepareDataProvider, $this, $filter);
        }

        /* @var $modelClass \yii\db\BaseActiveRecord */        $modelClass = $this->modelClass;
        $model = new $modelClass();

        $allModels = $model->getCacheComponents();

        return Yii::createObject([
            'class' => ArrayDataProvider::className(),
            'allModels' => $allModels,
            'pagination' => [
                'params' => $requestParams,
            ],
            'sort' => [
                'params' => $requestParams,
            ],
        ]);
    }
}

8、创建获取缓存组件列表的数据序列化类,\api\rests\cache_component\Serializer.php

<?php
/**
 * @link http://www.yiiframework.com/
 * @copyright Copyright (c) 2008 Yii Software LLC
 * @license http://www.yiiframework.com/license/
 */
namespace api\rests\cache_component;

use Yii;
use yii\data\DataProviderInterface;

/**
 * Serializer converts resource objects and collections into array representation.
 *
 * Serializer is mainly used by REST controllers to convert different objects into array representation
 * so that they can be further turned into different formats, such as JSON, XML, by response formatters.
 *
 * The default implementation handles resources as [[Model]] objects and collections as objects
 * implementing [[DataProviderInterface]]. You may override [[serialize()]] to handle more types.
 *
 * @author Qiang Wang <shuijingwanwq@163.com>
 * @since 1.0
 */class Serializer extends \yii\rest\Serializer
{
    /**
     * Serializes a data provider.
     * @param DataProviderInterface $dataProvider
     * @return array the array representation of the data provider.
     */    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 = [
            $this->collectionEnvelope => $models,
        ];

        if (empty($result['items'])) {
            return ['code' => 20013, 'message' => Yii::t('error', '20013')];
        }

        if ($pagination !== false) {
            return ['code' => 10000, 'message' => Yii::t('app', '10007'), 'data' => array_merge($result, $this->serializePagination($pagination))];
        }

        return ['code' => 10000, 'message' => Yii::t('app', '10007'), 'data' => $result];
    }
}

9、新增获取缓存组件列表的路由配置,编辑 \api\config\_urlManager.php

        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/cache-component'],
            'only' => ['index'],
        ],

10、GET 请求:http://www.cmcp-api.localhost/v1/cache-components?tenantid=default&api_gateway_user_id=1 ,响应成功,如图1

{
    "code": 10000,
    "message": "获取缓存组件列表成功",
    "data": {
        "items": [
            {
                "name": "cache",
                "class": "yii\\caching\\DummyCache"
            },
            {
                "name": "redisCache",
                "class": "yii\\redis\\Cache"
            },
            {
                "name": "frontendCache",
                "class": "yii\\caching\\DummyCache"
            }
        ],
        "_links": {
            "self": {
                "href": "http://www.cmcp-api.localhost/v1/cache-components?tenantid=default&api_gateway_user_id=1&page=1"
            }
        },
        "_meta": {
            "totalCount": 3,
            "pageCount": 1,
            "currentPage": 1,
            "perPage": 20
        }
    }
}

图1

永夜