Yii2 yii\web\UrlManager自定义REST路由配置的最优可靠方案
Yii2 自定义REST路由冗余问题最优解决方案
零成本快速方案:直接省略HTTP动词前缀
Yii2的yii\rest\UrlRule原生支持不指定HTTP动词的路由规则,这种写法会自动匹配所有请求方法,不需要为每个动词单独写一行配置。
你之前的配置可以直接简化成:
'rules' => [ [ 'class' => 'yii\rest\UrlRule', 'controller' => 'user', 'pluralize' => false, 'except' => ['index'], 'extraPatterns' => [ // 直接写路由 => 动作映射,不需要加GET/POST等前缀,自动支持所有HTTP方法 'test/{id}' => 'test', // 其他自定义动作直接按相同格式追加即可 ], ], ],
这种写法和逐行写全POST/GET/PUT/PATCH/OPTIONS/DELETE6种动词的效果完全一致,单动作配置行数直接从6行降到1行,总配置量从210行压缩到35行。
安全提示:如果部分动作需要限制请求方法(比如某个写入动作只允许POST),可以单独为该动作写带指定动词前缀的规则,指定动词的规则优先级高于通配规则。同时建议在控制器的
behaviors()方法中配置VerbFilter,做第二层请求方法校验,避免路由配置疏漏导致的安全问题。
长期可维护方案:封装自定义通用UrlRule
如果项目后续还会新增更多REST控制器、更多自定义动作,可以封装一个自定义UrlRule基类,把通用逻辑统一收口,进一步减少重复配置。
- 新建通用UrlRule类,路径可根据项目目录结构调整,示例代码如下:
<?php namespace common\components; use yii\rest\UrlRule as BaseRestUrlRule; class RestUrlRule extends BaseRestUrlRule { /** * 默认支持的HTTP动词列表,全局统一维护 */ public $allowedVerbs = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS']; /** * 控制器自定义动作映射 */ public $customActions = []; public function init() { $generatedPatterns = []; foreach ($this->customActions as $pattern => $action) { // 自动为每个自定义动作生成所有允许动词的路由规则 foreach ($this->allowedVerbs as $verb) { $generatedPatterns["{$verb} {$pattern}"] = $action; } } // 合并手动配置的extraPatterns,手动配置优先级更高,可覆盖自动生成的规则 $this->extraPatterns = array_merge($generatedPatterns, $this->extraPatterns); parent::init(); } }
- 后续配置路由时,直接使用该自定义类即可,配置逻辑和原生一致,不需要逐行写动词:
'rules' => [ [ 'class' => 'common\components\RestUrlRule', 'controller' => 'user', 'pluralize' => false, 'except' => ['index'], 'customActions' => [ 'test/{id}' => 'test', // 该控制器下其他自定义动作 ], ], // 其他控制器配置同理 ],
如果多个控制器有完全相同的自定义动作,还可以直接把控制器名写成数组,一次配置复用给多个控制器,进一步压缩配置量:
[ 'class' => 'common\components\RestUrlRule', 'controller' => ['user', 'post', 'comment', 'admin'], // 动作一致的控制器全部列在这里 'pluralize' => false, 'customActions' => [ 'test/{id}' => 'test', // 其他公共自定义动作 ], ],
方案对比
- 省略动词前缀的零成本方案:无需新增任何代码,改完配置立刻生效,适合快速迭代的中小型项目
- 自定义UrlRule方案:全局统一维护允许的动词列表,支持公共动作复用,适合控制器多、长期迭代的项目
两种方案都完全兼容Yii2原生的路由解析逻辑,不会引入额外的稳定性问题,配置量相比逐行写动词的方案减少80%以上,完全不会出现配置文件臃肿的问题。
内容的提问来源于stack exchange,提问作者trejder
相关产品推荐
相关产品推荐

