You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Yii2路由规则定义语法及UrlManager变量配置技术咨询

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'
    

    匹配URLarticle/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:39:21