yii2控制器文件名必须为xxxcontroller.php,类名需严格匹配并继承yii\base\controller,路由连字符转驼峰,模块控制器须完整声明命名空间且模块配置正确。

控制器文件名必须是 XXXController.php 格式
Yii2 会按固定规则从 URL 路由中推导控制器类名,FooBarController.php 对应路由 foo-bar,UserLoginController.php 对应 user-login。文件名里 Controller 是硬性后缀,少一个字母或大小写错误(比如 usercontroller.php)都会导致 404。
控制器类名要匹配文件名且继承 yii\base\Controller
类名必须和文件名主体一致,且首字母大写、无下划线——FooBarController.php 里必须定义 class FooBarController extends \yii\base\Controller。常见错误包括:
- 写成
class Foo_bar_controller(用了下划线或小写) - 继承了
yii\web\Controller却在 REST 场景下用(该类不含serializer等 REST 特性) - 忘了
extends,直接写class FooBarController(PHP 不报错但 Yii 找不到合法控制器)
路由中的连字符对应类名里的驼峰大写字母
URL 路由 user-profile/update 会被解析为控制器 ID user-profile + 动作 ID update,最终加载 UserProfileController 类。这个映射靠 Controller::createAction() 里的正则和 str_replace 实现,它把 - 替换成空格再 ucwords,所以 api-v1 → ApiV1Controller,不是 ApiV1controller 或 Apiv1Controller。
注意:如果类名是 ApiV1Controller,但文件名写成 apiv1controller.php 或 ApiV1controller.php,照样加载失败——大小写和拼写必须完全一致。
模块内控制器的路径和命名要同步调整
放在 modules/admin/controllers/UserController.php 的类,完整类名得是 app\modules\admin\controllers\UserController,不能漏掉 modules\admin\controllers\ 这段命名空间。否则即使文件存在、类名对,也会报 Class not found。
容易被忽略的是:模块配置里 'admin' => ['class' => 'app\modules\admin\Module'] 必须正确,且该模块类中 $controllerNamespace = 'app\modules\admin\controllers' 不能写错——这里少个 controllers 或多写个斜杠,路由就断在模块层,根本不会进控制器加载逻辑。











