




<pre class="wp-block-syntaxhighlighter-code">
<?php
return [
'class' => yii\web\UrlManager::class,
'enablePrettyUrl' => true,
'enableStrictParsing' => true,
'showScriptName' => false,
'rules' => [
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/user'],
],
/* 选题管理 */
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/plan'],
'only' => ['index', 'create', 'view', 'update', 'delete', 'have', 'wait-review', 'cmc-group', 'edit', 'submit', 'refuse', 'pass', 'return', 'disable', 'enable', 'invite', 'invite-accept'],
'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
'extraPatterns' => [
'GET have' => 'have',
'GET wait-review' => 'wait-review',
'GET cmc-group/{id}' => 'cmc-group',
'GET edit/{id}' => 'edit',
'PUT submit/{id}' => 'submit',
'PUT refuse/{id}' => 'refuse',
'PUT pass/{id}' => 'pass',
'PUT return/{id}' => 'return',
'PUT disable/{id}' => 'disable',
'PUT enable/{id}' => 'enable',
'POST invite/{id}' => 'invite',
'PUT invite-accept/{id}' => 'invite-accept',
],
],
],
];
</pre>
<pre class="wp-block-syntaxhighlighter-code">
<?php
namespace api\controllers;
use yii\rest\ActiveController;
class PlanController extends ActiveController
{
public $serializer = [
'class' => 'api\rests\plan\Serializer',
'collectionEnvelope' => 'items',
];
/**
* @inheritdoc
*/
public function actions()
{
$actions = parent::actions();
// 禁用"options"动作
unset($actions['options']);
$actions['index']['class'] = 'api\rests\plan\IndexAction';
$actions['create']['class'] = 'api\rests\plan\CreateAction';
$actions['view']['class'] = 'api\rests\plan\ViewAction';
$actions['update']['class'] = 'api\rests\plan\UpdateAction';
$actions['delete']['class'] = 'api\rests\plan\DeleteAction';
$actions['have'] = [
'class' => 'api\rests\plan\HaveAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['wait-review'] = [
'class' => 'api\rests\plan\WaitReviewAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['cmc-group'] = [
'class' => 'api\rests\plan\CmcGroupAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['edit'] = [
'class' => 'api\rests\plan\EditAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['submit'] = [
'class' => 'api\rests\plan\SubmitAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['refuse'] = [
'class' => 'api\rests\plan\RefuseAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['pass'] = [
'class' => 'api\rests\plan\PassAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['return'] = [
'class' => 'api\rests\plan\ReturnAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['disable'] = [
'class' => 'api\rests\plan\DisableAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['enable'] = [
'class' => 'api\rests\plan\EnableAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['invite'] = [
'class' => 'api\rests\plan\InviteAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
$actions['invite-accept'] = [
'class' => 'api\rests\plan\InviteAcceptAction',
'modelClass' => $this->modelClass,
'checkAccess' => [$this, 'checkAccess'],
];
return $actions;
}
}
</pre>
<pre class="wp-block-syntaxhighlighter-code">
<?php
namespace api\modules\v1\controllers;
/**
* Plan controller for the `v1` module
*/
class PlanController extends \api\controllers\PlanController
{
public $modelClass = 'api\modules\v1\models\Plan';
}
</pre>
<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\plan;
use Yii;
use api\models\Plan;
use api\models\PlanQuery;
use api\models\redis\cmc_console\User as RedisCmcConsoleUser;
use yii\base\InvalidConfigException;
use yii\data\ActiveDataProvider;
use yii\web\UnprocessableEntityHttpException;
/**
* 我的选题(获取选题列表):/plans/have(plan/have)
*
* 1、请求参数列表
* (1)filter[created_at][gte]:可选,选题的开始时间,默认:null
* (2)filter[created_at][lte]:可选,选题的结束时间,默认:null
* (3)filter[status]:可选,选题状态,0:禁用;1:编辑;2:待审;3:通过;4:拒绝;5:指派;6:完成,默认:null
* (4)filter[title][like]:可选,选题标题,默认:null
*
* 2、输入数据验证规则
* (1)整数:created_at、status
* (2)字符串(最大长度:64):title
* (3)范围([0, 1, 2, 3, 4, 5, 6]):status
*
* 3、查询规则
* (1)栏目是否被删除,0:否
* (2)选题是否被删除,0:否
* (3)(选题的租户ID为当前租户ID && 选题创建用户ID为当前登录用户ID && 栏目人员是否被删除,0:否) (选题的租户ID为当前租户ID && 选题执行(负责)用户ID为当前登录用户ID && 栏目人员是否被删除,0:否) || (选题的租户ID为当前租户ID && 栏目人员配置角色标识包含栏目负责人标识) || (选题模型的是否跨租户(不隔离),1:是 && 选题与租户的关联模型的关联的租户ID为当前租户ID && 选题与租户的关联模型的是否邀请者,0:否 && 选题与租户的关联模型的接受状态,0:待接受;2:已拒绝 && 选题与租户的关联模型是否被删除,0:否) || (选题模型的是否跨租户(不隔离),1:是 && 选题与租户的关联模型的关联的租户ID为当前租户ID && 选题与租户的关联模型的是否邀请者,0:否 && 选题与租户的关联模型的接受状态,1:已接受 && 选题与租户的关联模型的接受用户ID为当前登录用户ID && 选题与租户的关联模型是否被删除,0:否 && 栏目人员是否被删除,0:否) || (选题模型的是否跨租户(不隔离),1:是 && 选题与租户的关联模型的关联的租户ID为当前租户ID && 选题与租户的关联模型的是否邀请者,0:否 && 选题与租户的关联模型的接受状态,1:已接受 && 选题与租户的关联模型是否被删除,0:否 && 栏目人员配置角色标识包含栏目负责人标识)
*
* 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 HaveAction extends \yii\rest\IndexAction
{
public $dataFilter = [
'class' => 'yii\data\ActiveDataFilter',
'searchModel' => 'api\models\PlanSearch',
'attributeMap' => [
'created_at' => '{{%plan}}.[[created_at]]',
'status' => '{{%plan}}.[[status]]',
'title' => '{{%plan}}.[[title]]',
],
];
/**
* Prepares the data provider that should return the requested collection of the models.
* @return ActiveDataProvider
* @throws InvalidConfigException if a registered parser does not implement the [[RequestParserInterface]].
* @throws UnprocessableEntityHttpException
*/
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) {
$firstError = '';
foreach ($this->dataFilter->getFirstErrors() as $message) {
$firstError = $message;
break;
}
throw new UnprocessableEntityHttpException(Yii::t('error', Yii::t('error', Yii::t('error', '224003'), ['first_error' => $firstError])), 224003);
}
}
}
if ($this->prepareDataProvider !== null) {
return call_user_func($this->prepareDataProvider, $this, $filter);
}
// 当前用户的身份实例,未认证用户则为 Null
/* @var $identity RedisCmcConsoleUser */
$identity = Yii::$app->user->identity;
/* @var $modelClass Plan */
$modelClass = $this->modelClass;
/* @var $haveQuery PlanQuery */
// 获取查询对象(我的选题(获取选题列表))
$haveQuery = $modelClass::getHaveQuery($identity);
$query = $haveQuery->orderBy([$modelClass::tableName() . '.id' => SORT_DESC]);
if (!empty($filter)) {
$query->andFilterWhere($filter);
}
return Yii::createObject([
'class' => ActiveDataProvider::className(),
'query' => $query,
'pagination' => [
'params' => $requestParams,
],
'sort' => [
'params' => $requestParams,
],
]);
}
}
</pre>
<pre class="wp-block-syntaxhighlighter-code">
/* 移动端 */
// 移动端 - 选题
[
'class' => 'yii\rest\UrlRule',
'controller' => ['v1/mobile/plan'],
'only' => ['index', 'create', 'view', 'update', 'delete', 'have', 'wait-review', 'cmc-group', 'edit', 'submit', 'refuse', 'pass', 'return', 'disable', 'enable', 'invite', 'invite-accept'],
'tokens' => ['{id}' => '<id:\\w[\\w,:;]*>'],
'extraPatterns' => [
'GET have' => 'have',
'GET wait-review' => 'wait-review',
'GET cmc-group/{id}' => 'cmc-group',
'GET edit/{id}' => 'edit',
'PUT submit/{id}' => 'submit',
'PUT refuse/{id}' => 'refuse',
'PUT pass/{id}' => 'pass',
'PUT return/{id}' => 'return',
'PUT disable/{id}' => 'disable',
'PUT enable/{id}' => 'enable',
'POST invite/{id}' => 'invite',
'PUT invite-accept/{id}' => 'invite-accept',
],
],
</pre>
<pre class="wp-block-syntaxhighlighter-code">
<?php
namespace api\controllers\mobile;
class PlanController extends \api\controllers\PlanController
{
public $serializer = [
'class' => 'api\rests\mobile\plan\Serializer',
'collectionEnvelope' => 'items',
];
/**
* @inheritdoc
*/
public function actions()
{
$actions = parent::actions();
$actions['index']['class'] = 'api\rests\mobile\plan\IndexAction';
$actions['create']['class'] = 'api\rests\mobile\plan\CreateAction';
$actions['view']['class'] = 'api\rests\mobile\plan\ViewAction';
$actions['update']['class'] = 'api\rests\mobile\plan\UpdateAction';
$actions['delete']['class'] = 'api\rests\mobile\plan\DeleteAction';
$actions['have']['class'] = 'api\rests\mobile\plan\HaveAction';
$actions['wait-review']['class'] = 'api\rests\mobile\plan\WaitReviewAction';
$actions['cmc-group']['class'] = 'api\rests\mobile\plan\CmcGroupAction';
$actions['edit']['class'] = 'api\rests\mobile\plan\EditAction';
$actions['submit']['class'] = 'api\rests\mobile\plan\SubmitAction';
$actions['refuse']['class'] = 'api\rests\mobile\plan\RefuseAction';
$actions['pass']['class'] = 'api\rests\mobile\plan\PassAction';
$actions['return']['class'] = 'api\rests\mobile\plan\ReturnAction';
$actions['disable']['class'] = 'api\rests\mobile\plan\DisableAction';
$actions['enable']['class'] = 'api\rests\mobile\plan\EnableAction';
$actions['invite']['class'] = 'api\rests\mobile\plan\InviteAction';
$actions['invite-accept']['class'] = 'api\rests\mobile\plan\InviteAcceptAction';
return $actions;
}
}
</pre>
<pre class="wp-block-syntaxhighlighter-code">
<?php
namespace api\modules\v1\controllers\mobile;
/**
* Plan controller for the `v1` module
*/
class PlanController extends \api\controllers\mobile\PlanController
{
public $modelClass = 'api\modules\v1\models\Plan';
}
</pre>

<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;
class HaveAction extends \api\rests\plan\HaveAction
{
}
</pre>
<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;
class Serializer extends \api\rests\plan\Serializer
{
}
</pre>


PHP / Laravel / Yii2 老项目维护与长期技术支持
如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。
适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护
可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查
如需咨询,请联系我,并注明:PHP 维护咨询。
联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

发表回复