Yii2路由规则定义语法及UrlManager变量配置技术咨询
我来帮你把Yii2路由规则里的变量定义讲明白,这部分其实是实现友好URL的核心,咱们结合你的配置例子一步步拆解:
基本语法规则
路由规则里的变量采用 <变量名:正则表达式> 的格式,左边的pattern(URL模式)通过这个格式匹配URL中的片段,然后把匹配到的值映射到右边路由的对应参数里。
比如你配置里的这条规则:
'<controller:[\w-]+>/<id:\d+>' => '<controller>/view'
它的作用是:
- 匹配类似
post/123、user/456这样的URL - 把URL中第一个片段(比如
post)赋值给controller变量,第二个数字片段(比如123)赋值给id变量 - 最终映射到对应控制器的
view动作,比如PostController::actionView(),你可以在动作里通过$id参数(或者Yii::$app->request->get('id'))拿到这个值
各部分细节拆解
1. 变量名
变量名可以是Yii默认的参数名(比如controller、action),也可以是自定义的参数名:
- 用
controller:会自动对应到控制器类名(比如post对应PostController) - 用
action:会自动对应到动作方法(比如list对应actionList) - 自定义参数:比如
<slug:[\w-]+>,这个变量会作为请求参数传递到动作中
2. 正则表达式
正则用来限制URL片段的格式,避免规则冲突,常用的几种:
\d+:匹配1个或多个数字,适合ID类参数[\w-]+:匹配字母、数字、下划线和横杠,适合控制器名、动作名、URL别名(比如sign-up).*:匹配任意字符(谨慎使用,容易和其他规则冲突)[a-z]+:匹配小写字母,适合特定格式的参数
3. 路由映射
右边的路由字符串里,可以直接使用左边定义的变量,比如:
'<c:[\w-]+>/<a:[\w-]+>' => '<c>/<a>'
这个规则会把URLuser/profile映射到UserController::actionProfile(),这里的c和a是自定义的变量名,和默认的controller、action效果一致。
实用示例
给你几个常用的规则例子,方便参考:
自定义参数匹配:
'article/<slug:[\w-]+>' => 'article/view'匹配URL
article/yii2-pretty-url-best-practices,映射到ArticleController::actionView(),并传递slug参数,动作里可以用public function actionView($slug)接收。带可选参数:
'<controller:[\w-]+>/<action:[\w-]+>/<page:\d+>?' => '<controller>/<action>'既匹配
post/list/2(带page参数),也匹配post/list(不带page参数),注意可选参数要放在规则的最后。多参数组合:
'category/<cat_id:\d+>/post/<post_id:\d+>' => 'post/detail'匹配
category/5/post/100,映射到PostController::actionDetail(),并传递cat_id和post_id两个参数。
路由规则调试方法
你提到想调试路由规则,Yii2可以通过日志查看匹配过程:
在应用配置的log组件中添加URL管理器的日志目标:
'log' => [ 'traceLevel' => YII_DEBUG ? 3 : 0, 'targets' => [ [ 'class' => 'yii\log\FileTarget', 'categories' => ['yii\web\UrlManager*'], 'levels' => ['trace', 'info'], 'logFile' => '@runtime/logs/url-manager.log', ], ], ],
开启后,访问URL时,Yii会在runtime/logs/url-manager.log里记录每条规则的匹配尝试,能清楚看到哪个规则成功匹配,哪个被跳过,帮你快速定位问题。
内容的提问来源于stack exchange,提问作者natral

