yii2与yii3路由机制不兼容:yii2依赖urlmanager配置数组,yii3改用yiisoft/router组件通过代码注册;混用会直接报错。

Yii2 和 Yii3 的路由机制差异较大,写法不兼容,混用会直接报错。核心区别在于:Yii2 路由由 urlManager 统一管理,规则写在配置里;Yii3 则完全解耦,路由由独立的 yiisoft/router 组件处理,通过代码注册,不再依赖全局配置数组。
Yii2.0 路由写法(避免 404 或解析失败)
必须确保三要素齐全且位置正确:
-
开启美化:在
config/web.php的components中启用'enablePrettyUrl' => true,并设'showScriptName' => false(否则仍带index.php) -
Web 服务器重写支持:Apache 需
.htaccess,Nginx 需在 server 块中添加try_files $uri $uri/ /index.php?$args;,否则美化 URL 根本无法进入框架 -
rules 规则格式准确:键是匹配的 URL 模式,值是目标路由(控制器/动作),如
'about' => 'site/about'或'post/<id:>' => 'post/view'</id:>;正则部分要用尖括号包裹,\d+不能写成d+
Yii3 路由写法(避免“Route not found”或 DI 注入失败)
不靠配置文件,而是通过 PHP 代码显式定义和注册:
-
安装并启用 router 组件:运行
composer require yiisoft/router,并在应用启动时(如public/index.php)注入Router实例 -
用 Router::add() 注册路由:例如
$router->add('GET', '/about', [SiteController::class, 'about']);动词必须大写,路径以/开头,控制器方法需可调用 -
参数绑定需显式声明:带参数的路由如
/post/{id},必须配合->withDefaults(['id' => null])或使用->withConstraints(['id' => '\d+']),否则匹配失败
常见报错原因与对应修复
以下错误多因版本混淆或配置遗漏导致:
-
“Invalid Parameter – yii\base\InvalidParamException”:Yii2 中
rules数组里写了非法字符串(如漏掉引号、用了中文符号),或正则语法错误(如<id:></id:>写成<w></w>) -
“Class 'yii\web\UrlManager' not found”:在 Yii3 项目里误用了 Yii2 的类名或配置项,Yii3 已移除该类,改用
RouterInterface和中间件链 -
“No route found for GET /xxx”:Yii3 中未调用
$router->match(),或请求方法(GET/POST)与注册时不一致,或中间件未把请求交给路由器处理
迁移建议:从 Yii2 升级到 Yii3 时的路由处理
不要试图复用旧 rules 数组,应逐步重构:
- 先保留 Yii2 路由逻辑跑通,再新建 Yii3 的
Router实例,将关键路由逐条用add()注册 - 静态页面(如 about、contact)优先迁移;含复杂参数或 RESTful 的路由,注意 Yii3 默认不自动复数化(
users不自动映射到UserController),需手动指定 - 所有 URL 生成必须改用
UrlGeneratorInterface::generate(),不能再用 Yii2 的Url::to()










