yii2自定义控制器和路由需满足三点:控制器命名规范(类名controller结尾、动作public function actionxxx)、启用美化url(enableprettyurl=true且showscriptname=false)、正确挂载urlmanager规则;否则无法摆脱/index.php?r=xxx格式。

安装 Yii2 基础版后,自定义控制器和路由是项目起步阶段最常做的两件事。核心就三点:控制器命名规范、URL 美化开启、规则正确挂载。不配好这三块,/index.php?r=xxx 就一直跟着你。
创建符合规范的控制器
控制器文件必须放在 controllers/ 目录下,类名以 Controller 结尾,继承 yii\web\Controller。例如:
- 文件名:
controllers/PostController.php - 类名:
app\controllers\PostController - 动作方法必须是
public function actionXXX()格式,比如actionView()对应路由post/view
注意大小写:控制器 ID 是小写连字符(user-profile),对应类名 UserProfileController;动作 ID 是小写驼峰(actionUserList),路由中写作 user-profile/user-list。
启用美化 URL 并配置 urlManager
在 config/web.php 的 components 中添加或修改 urlManager:
-
'enablePrettyUrl' => true:开启路径式路由(去掉?r=) -
'showScriptName' => false:隐藏index.php(Apache 需启用mod_rewrite,Nginx 需配置try_files) -
'rules'数组必须存在,即使为空——否则自定义规则不会生效
示例配置片段:
return ['components' => [
'urlManager' => [
'enablePrettyUrl' => true,
'showScriptName' => false,
'rules' => [],
],
],
];
添加自定义 URL 规则(别名+参数)
规则要写进 urlManager['rules'] 数组,格式为 '路径模板' => '路由字符串'。关键细节:
- 路径中用
<id:></id:>提取数字参数,<slug:></slug:>匹配英文短横线,不写 pattern 默认匹配非斜杠任意字符 - 规则必须显式声明类型才能支持正则:写成
['pattern'=>'post/<id:>', 'route'=>'post/view']</id:>,而不是只写'post/<id:>' => 'post/view'</id:> - 顺序很重要:更具体的规则(如带
<id></id>)放前面,泛化规则(如'' => 'site/index')放最后 - 生成 URL 时,
Url::to(['post/view', 'id' => 123])才会变成/post/123;如果还是输出?r=,先检查enablePrettyUrl和showScriptName是否都为true/false
设置默认控制器与默认动作(可选)
不想每次访问都输 /site/index?可在 config/web.php 中设:
-
'defaultRoute' => 'post/index':整个应用默认入口 - 在控制器类里设
public $defaultAction = 'list';:该控制器下访问/post自动执行actionList
这两项不冲突,优先级是:具体路由 > 控制器 defaultAction > 应用 defaultRoute。











