基于 Yii 2.0 的 RESTful 风格的 API,选题任务的素材实现的代码审查
1、要求新来的同事实现时提出的需求如下:
(1)已登录,桌面端
\api\rests\resource
修改为:
\api\rests\plan_task_resource
(2)游客,不做改动
\api\rests\client_resource
(3)已登录,移动端
任务管理 – 删除任务素材
任务管理 – 管理后台素材列表
\api\rests\mobile\plan_task_resource
(4)已登录,移动端
/v1/mobile/resources/resource
素材上传
\api\rests\mobile\plan_task_resource
2、代码审查,\api\config\urlManager.php,配置:’controller’ => [‘v1/client-resource’], 存在 2 处,规则配置冗余,删除(客户端 — 任务管理 – 素材)
1 2 3 4 5 6 7 8 9 10 11 | // 客户端 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/client-resource' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'create' , 'POST make-up' => 'makeup' , 'POST del-or-recovery' => 'del-or-recovery' , ], ], |
1 2 3 4 5 6 7 | // 客户端 -- 任务管理 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/client-resource' ], 'only' => [ 'index' , 'create' , 'update' , 'edit' , 'list' , 'delete' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], ], |
3、\api\config\urlManager.php,配置:’controller’ => [‘v1/client-resource’], 规则调整如下(规范:模式名称与操作名称应保持一致、配置 only 选项来明确列出支持哪些行为):
调整为:
1 2 3 4 5 6 7 8 9 10 11 12 | // 客户端 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/client-resource' ], 'only' => [ 'resource' , 'make-up' , 'del-or-recovery' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'resource' , 'POST make-up' => 'make-up' , 'POST del-or-recovery' => 'del-or-recovery' , ], ], |
4、控制器:\api\controllers\ClientResourceController.php,actions() 方法需要调整,yii\rest\ActiveController 默认提供一些动作,如果不需要的话,需要销毁。通过 RESTful APIs 显示数据时,经常需要检查当前用户是否有权限访问和操作所请求的资源, 在 yii\rest\ActiveController 中, 可覆盖 checkAccess() 方法来完成权限检查。=> 的前后,仅需要一个空格,无需对齐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | /** * @inheritdoc */ public function actions() { $actions = parent::actions(); $actions [ 'create' ] = [ 'class' => 'api\rests\client_resource\ResourceAction' , 'modelClass' => $this ->modelClass, ]; $actions [ 'makeup' ] = [ 'class' => 'api\rests\client_resource\ResourceUpdateAction' , 'modelClass' => $this ->modelClass, ]; $actions [ 'del-or-recovery' ] = [ 'class' => 'api\rests\client_resource\DelOrRecoveryAction' , 'modelClass' => $this ->modelClass, ]; return $actions ; } |
调整为:
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 | /** * @inheritdoc */ public function actions() { $actions = parent::actions(); // 禁用"index"、"view"、"create"、"update"、"delete"、"options"动作 unset( $actions [ 'index' ], $actions [ 'view' ], $actions [ 'create' ], $actions [ 'update' ], $actions [ 'delete' ], $actions [ 'options' ]); $actions [ 'resource' ] = [ 'class' => 'api\rests\client_resource\ResourceAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'make-up' ] = [ 'class' => 'api\rests\client_resource\ResourceUpdateAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; $actions [ 'del-or-recovery' ] = [ 'class' => 'api\rests\client_resource\DelOrRecoveryAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; return $actions ; } |
5、模块 v1 中的控制器:\api\modules\v1\controllers\ClientResourceController.php,代码注释与控制器本身未保持一致
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace api\modules\v1\controllers; /** * Menu controller for the `v1` module */ class ClientResourceController extends \api\controllers\ClientResourceController { public $modelClass = 'api\modules\v1\models\Resource' ; } |
调整为:
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace api\modules\v1\controllers; /** * ClientResource controller for the `v1` module */ class ClientResourceController extends \api\controllers\ClientResourceController { public $modelClass = 'api\modules\v1\models\Resource' ; } |
6、目录:\api\rests\client_resource 中的方法文件,需要重命名:
\api\rests\client_resource\ResourceUpdateAction.php 重命名为:\api\rests\client_resource\MakeUpAction.php
7、已登录,桌面端,\api\config\urlManager.php,配置:’controller’ => [‘v1/plan-task-resource’], 数组的 , 后需要一个空格
1 2 3 4 5 6 7 8 9 10 | // 任务管理 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/plan-task-resource' ], 'only' => [ 'index' , 'delete' , 'create' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'create' , ], ], |
调整为:
1 2 3 4 5 6 7 8 9 10 | // 任务管理 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/plan-task-resource' ], 'only' => [ 'index' , 'delete' , 'resource' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'resource' , ], ], |
8、控制器:\api\controllers\PlanTaskResourceController.php,actions() 方法需要调整,yii\rest\ActiveController 默认提供一些动作,如果不需要的话,需要销毁。通过 RESTful APIs 显示数据时,经常需要检查当前用户是否有权限访问和操作所请求的资源, 在 yii\rest\ActiveController 中, 可覆盖 checkAccess() 方法来完成权限检查。=> 的前后,仅需要一个空格,无需对齐。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /** * @inheritdoc */ public function actions() { $actions = parent::actions(); $actions [ 'delete' ][ 'class' ] = 'api\rests\plan_task_resource\DeleteAction' ; $actions [ 'index' ][ 'class' ] = 'api\rests\plan_task_resource\IndexAction' ; $actions [ 'create' ] = [ 'class' => 'api\rests\plan_task_resource\ResourceAction' , 'modelClass' => $this ->modelClass, ]; return $actions ; } |
调整为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | /** * @inheritdoc */ public function actions() { $actions = parent::actions(); // 禁用"view"、"create"、"update"、"options"动作 unset( $actions [ 'view' ], $actions [ 'create' ], $actions [ 'update' ], $actions [ 'options' ]); $actions [ 'delete' ][ 'class' ] = 'api\rests\plan_task_resource\DeleteAction' ; $actions [ 'index' ][ 'class' ] = 'api\rests\plan_task_resource\IndexAction' ; $actions [ 'resource' ] = [ 'class' => 'api\rests\plan_task_resource\ResourceAction' , 'modelClass' => $this ->modelClass, 'checkAccess' => [ $this , 'checkAccess' ], ]; return $actions ; } |
9、模块 v1 中的控制器:\api\modules\v1\controllers\ResourceController.php,类名与文件名未保持一致,代码注释与控制器本身未保持一致。IDE 提示:非控制器类文件,如图1
\api\modules\v1\controllers\ResourceController.php 重命名为:\api\modules\v1\controllers\PlanTaskResourceController.php
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace api\modules\v1\controllers; /** * Menu controller for the `v1` module */ class PlanTaskResourceController extends \api\controllers\PlanTaskResourceController { public $modelClass = 'api\modules\v1\models\Resource' ; } |
调整为:
1 2 3 4 5 6 7 8 9 10 11 | <?php namespace api\modules\v1\controllers; /** * PlanTaskResource controller for the `v1` module */ class PlanTaskResourceController extends \api\controllers\PlanTaskResourceController { public $modelClass = 'api\modules\v1\models\Resource' ; } |
10、已登录,移动端,\api\config\urlManager.php,配置:’controller’ => [‘v1/mobile/plan-task-resource’], 数组的 , 后需要一个空格,代码注释未与菜单结构保持一致
1 2 3 4 5 6 7 8 9 10 | // 移动端 - 任务素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/mobile/plan-task-resource' ], 'only' => [ 'index' , 'delete' , 'create' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'create' , ], ], |
调整为:
1 2 3 4 5 6 7 8 9 10 | // 移动端 - 任务 - 素材 [ 'class' => 'yii\rest\UrlRule' , 'controller' => [ 'v1/mobile/plan-task-resource' ], 'only' => [ 'index' , 'delete' , 'resource' ], 'tokens' => [ '{id}' => '<id:\\w[\\w,:;]*>' ], 'extraPatterns' => [ 'POST resource' => 'resource' , ], ], |
11、控制器:\api\controllers\mobile\PlanTaskResourceController.php,actions() 方法需要调整。actions() 方法 与 公共属性 $serializer 之间,需要空出一行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php namespace api\controllers\mobile; class PlanTaskResourceController extends \api\controllers\PlanTaskResourceController { public $serializer = [ 'class' => 'api\rests\mobile\plan_task_resource\Serializer' , 'collectionEnvelope' => 'items' , ]; /** * @inheritdoc */ public function actions() { $actions = parent::actions(); $actions [ 'delete' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\DeleteAction' ; $actions [ 'index' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\IndexAction' ; $actions [ 'create' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\ResourceAction' ; return $actions ; } } |
调整为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?php namespace api\controllers\mobile; class PlanTaskResourceController extends \api\controllers\PlanTaskResourceController { public $serializer = [ 'class' => 'api\rests\mobile\plan_task_resource\Serializer' , 'collectionEnvelope' => 'items' , ]; /** * @inheritdoc */ public function actions() { $actions = parent::actions(); $actions [ 'delete' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\DeleteAction' ; $actions [ 'index' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\IndexAction' ; $actions [ 'resource' ][ 'class' ] = 'api\rests\mobile\plan_task_resource\ResourceAction' ; return $actions ; } } |
12、控制器:\api\controllers\mobile\ResourceController.php,需要删除
13、模块 v1 中的控制器:\api\modules\v1\controllers\mobile\ResourceController.php,需要删除
14、目录:\api\rests\mobile\plan_task_resource 中的方法文件,需要调整
\api\rests\mobile\plan_task_resource\Action.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace api\rests\mobile\plan_task_resource; /** * Action is the base class for action classes that implement RESTful API. * * For more details and usage information on Action, see the [guide article on rest controllers](guide:rest-controllers). * * @author Qiang Wang <shuijingwanwq@163.com> * @since 1.0 */ class Action extends \api\rests\plan_task_resource\Action { } |
\api\rests\mobile\plan_task_resource\Action.php
调整为:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php /** * @link http://www.yiiframework.com/ * @copyright Copyright (c) 2008 Yii Software LLC * @license http://www.yiiframework.com/license/ */ namespace api\rests\mobile\plan_task_resource; class Action extends \api\rests\plan_task_resource\Action { } |
\api\rests\mobile\plan_task_resource\DeleteAction.php、\api\rests\mobile\plan_task_resource\IndexAction.php、\api\rests\mobile\plan_task_resource\Serializer.php 等 3 个文件,皆需要删除对应的注释
\api\rests\mobile\plan_task_resource\ResourceAction.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php namespace api\rests\mobile\plan_task_resource; use Yii; use yii\db\ActiveRecord; use yii\rest\Action; use yii\web\ServerErrorHttpException; use api\models\Resource; use api\models\PlanTask; class ResourceAction extends \api\rests\plan_task_resource\ResourceAction { } |
\api\rests\mobile\plan_task_resource\ResourceAction.php,未实际使用的文件,其引用需要删除,如图2
调整为:
1 2 3 4 5 6 7 8 | <?php namespace api\rests\mobile\plan_task_resource; class ResourceAction extends \api\rests\plan_task_resource\ResourceAction { } |
15、路由的设计,从某个方面来说是存在问题的,没有充分利用 yii\rest\ActiveController 默认提供的一些动作,但是,由于接口需要向后兼容,路由已经不好调整,只好沿用下去。总结,建议同事些参考一下其他功能的实现,如果也存在上述类似的问题,皆需要逐一解决。
近期评论