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 } } }
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/250393.html