Yii3.0通过PSR-15中间件+路由注解实现URL美化,需用Route类定义路径规则(如Route::get('/article/{id:\d+}', [ArticleController::class, 'view'])),参数自动绑定并类型校验,支持伪静态后缀与多语言前缀路由。

要在Yii3.0中实现URL美化,必须绕过Yii2.x那套基于urlManager组件的配置方式——因为Yii3.0已彻底移除UrlManager类,改用PSR-15中间件+路由注解+参数绑定机制。直接复制旧版'enablePrettyUrl'=>true配置会报错,且无法启动应用。
启用路径模式路由
打开config/web.php,找到router配置项,在rules数组中添加一条路径规则:
使用yiisoft/router包提供的Route类声明路径匹配模式,例如:Route::get('/article/{id:\d+}', [ArticleController::class, 'view'])。
注意:正则约束{id:\d+}必须写在花括号内,不能写成{id}——否则参数不会被解析为整型,后续控制器中$id将始终是字符串类型,可能导致数据库查询失败。
保存后执行php yii serve启动服务,访问/article/123即可触发ArticleController::view()方法。
绑定URL参数到控制器方法
Yii3.0不再通过$_GET或$this->request->get('id')手动取参,而是靠依赖注入自动绑定。
在控制器方法签名中直接声明参数名与URL段同名的类型化参数:
public function view(int $id): ResponseInterface
框架会在调用前自动将路径中匹配的123转换为int并传入。若URL为/article/abc,则会抛出BadRequestHttpException,无需额外校验。
多个参数按顺序绑定:/user/{id:\d+}/profile/{tab:[a-z]+} → public function profile(int $id, string $tab)。
添加伪静态后缀(如.html)
方法一:在路由定义中硬编码后缀
将路径规则改为Route::get('/article/{id:\d+}.html', [ArticleController::class, 'view']),此时/article/123.html可访问,但/article/123会404。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
方法二:使用通配符匹配可选后缀
写成Route::get('/article/{id:\d+}{suffix:\.html?}', [ArticleController::class, 'view']),其中{suffix:\.html?}表示“.html”可有可无;控制器方法需增加?string $suffix = null参数接收该值。
【注意】正则中的点号.必须转义为\.,否则会被当作任意字符匹配,导致/article/123xhtml也能命中。
多语言路由支持
第一步:定义带语言前缀的路由规则
在config/web.php的router.rules中添加:
Route::get('/{lang:[a-z]{2}(-[a-z]{2})?}/article/{id:\d+}', [ArticleController::class, 'view'])
第二步:在控制器中接收语言参数并设置应用语言
修改view方法签名:public function view(string $lang, int $id): ResponseInterface。
在方法体内第一行执行:Yii::$app->setLanguage($lang);——这必须在视图渲染前完成,否则翻译函数仍用默认语言。
第三步:生成带语言前缀的链接
使用Url::to(['article/view', 'lang' => 'zh-CN', 'id' => 123]),框架会自动拼出/zh-CN/article/123;不传lang参数则生成无前缀链接。


















