在 Yii 2 Starter Kit 中实现 RESTful 应用的获取缓存组件列表
1、创建缓存组件的控制器类,\api\controllers\CacheComponentController.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | <?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
1 2 3 4 5 6 7 8 | <?php namespace api\models\redis; class CacheComponent extends \common\logics\redis\CacheComponent { } |
5、在接口应用的v1模块中,创建缓存组件的资源类,\api\modules\v1\models\redis\CacheComponent.php
1 2 3 4 5 6 7 8 | <?php namespace api\modules\v1\models\redis; class CacheComponent extends \api\models\redis\CacheComponent { } |
6、在接口应用的v1模块中,创建缓存组件的控制器类,定义模型类,\api\modules\v1\controllers\CacheComponentController.php
1 2 3 4 5 6 7 8 9 10 11 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | <?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
1 2 3 4 5 | [ '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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | { "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 } } } |
近期评论