没有不值得去解决的问题,也没有不值得去学习的技术!

基于 Yii 2.0 的 RESTful 风格的 API,选题任务的素材实现的代码审查

IDE 提示:非控制器类文件

作者:

, ,
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 处,规则配置冗余,删除(客户端 — 任务管理 – 素材)
<pre class="wp-block-syntaxhighlighter-code">

        // 客户端 - 素材
        [
            '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',
            ],
        ],

</pre>
<pre class="wp-block-syntaxhighlighter-code">

        // 客户端 -- 任务管理 - 素材
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/client-resource'],
            'only' => ['index', 'create', 'update', 'edit', 'list', 'delete'],
            'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
        ],

</pre>
3、\api\config\urlManager.php,配置:’controller’ => [‘v1/client-resource’], 规则调整如下(规范:模式名称与操作名称应保持一致、配置 only 选项来明确列出支持哪些行为): 调整为:
<pre class="wp-block-syntaxhighlighter-code">

        // 客户端 - 素材
        [
            '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',
            ],
        ],

</pre>
4、控制器:\api\controllers\ClientResourceController.php,actions() 方法需要调整,yii\rest\ActiveController 默认提供一些动作,如果不需要的话,需要销毁。通过 RESTful APIs 显示数据时,经常需要检查当前用户是否有权限访问和操作所请求的资源, 在 yii\rest\ActiveController 中, 可覆盖 checkAccess() 方法来完成权限检查。=> 的前后,仅需要一个空格,无需对齐。


    /**
     * @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;
    }


调整为:


    /**
     * @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,代码注释与控制器本身未保持一致
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
调整为:
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
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’], 数组的 , 后需要一个空格
<pre class="wp-block-syntaxhighlighter-code">

        // 任务管理 - 素材
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/plan-task-resource'],
            'only' => ['index','delete','create'],
            'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
            'extraPatterns' => [
                'POST resource' => 'create',
            ],
        ],

</pre>
调整为:
<pre class="wp-block-syntaxhighlighter-code">

        // 任务管理 - 素材
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/plan-task-resource'],
            'only' => ['index', 'delete', 'resource'],
            'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
            'extraPatterns' => [
                'POST resource' => 'resource',
            ],
        ],

</pre>
8、控制器:\api\controllers\PlanTaskResourceController.php,actions() 方法需要调整,yii\rest\ActiveController 默认提供一些动作,如果不需要的话,需要销毁。通过 RESTful APIs 显示数据时,经常需要检查当前用户是否有权限访问和操作所请求的资源, 在 yii\rest\ActiveController 中, 可覆盖 checkAccess() 方法来完成权限检查。=> 的前后,仅需要一个空格,无需对齐。


    /**
     * @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;
    }


调整为:


    /**
     * @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
IDE 提示:非控制器类文件
图1
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
调整为:
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
10、已登录,移动端,\api\config\urlManager.php,配置:’controller’ => [‘v1/mobile/plan-task-resource’], 数组的 , 后需要一个空格,代码注释未与菜单结构保持一致
<pre class="wp-block-syntaxhighlighter-code">

        // 移动端 - 任务素材
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/mobile/plan-task-resource'],
            'only' => ['index','delete','create'],
            'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
            'extraPatterns' => [
                'POST resource' => 'create',
            ],
        ],

</pre>
调整为:
<pre class="wp-block-syntaxhighlighter-code">

        // 移动端 - 任务 - 素材
        [
            'class' => 'yii\rest\UrlRule',
            'controller' => ['v1/mobile/plan-task-resource'],
            'only' => ['index', 'delete', 'resource'],
            'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
            'extraPatterns' => [
                'POST resource' => 'resource',
            ],
        ],

</pre>
11、控制器:\api\controllers\mobile\PlanTaskResourceController.php,actions() 方法需要调整。actions() 方法 与 公共属性 $serializer 之间,需要空出一行
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
调整为:
<pre class="wp-block-syntaxhighlighter-code">

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


</pre>
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
<pre class="wp-block-syntaxhighlighter-code">

<?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
{

}


</pre>
\api\rests\mobile\plan_task_resource\Action.php 调整为:
<pre class="wp-block-syntaxhighlighter-code">

<?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
{

}


</pre>
\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
<pre class="wp-block-syntaxhighlighter-code">

<?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
{

}


</pre>
\api\rests\mobile\plan_task_resource\ResourceAction.php,未实际使用的文件,其引用需要删除,如图2
未实际使用的文件,其引用需要删除
图2
调整为:
<pre class="wp-block-syntaxhighlighter-code">

<?php

namespace api\rests\mobile\plan_task_resource;

class ResourceAction extends \api\rests\plan_task_resource\ResourceAction
{

}


</pre>
15、路由的设计,从某个方面来说是存在问题的,没有充分利用 yii\rest\ActiveController 默认提供的一些动作,但是,由于接口需要向后兼容,路由已经不好调整,只好沿用下去。总结,建议同事些参考一下其他功能的实现,如果也存在上述类似的问题,皆需要逐一解决。

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理