Yii 2.0控制器子目录必须严格匹配命名空间路径,如app\controllers\site\DashboardController对应@/controllers/site/DashboardController.php,命名空间需完整声明且大小写敏感,controllerNamespace配置不可省略顶层命名空间。

控制器子目录在 Yii 2.0 中完全支持,但必须匹配命名空间路径
Yii 2.0 的控制器类名和文件路径强绑定命名空间,子目录不是“放哪都行”,而是要让 app\controllers\site\DashboardController 这类类名能被自动解析到 @app/controllers/site/DashboardController.php。否则会报 Class 'app\controllers\site\DashboardController' not found。
- 控制器类必须声明为
namespace app\controllers\{子目录名};(注意:子目录名是命名空间的一部分,不是文件系统别名) - 文件路径必须严格对应命名空间:比如
namespace app\controllers\api\v1;→ 文件必须在@app/controllers/api/v1/PostController.php - 不要在命名空间里加
Controller后缀(app\controllers\user\ProfileController是对的;app\controllers\user\ProfileControllerController是错的)
配置 controllerNamespace 时不能省略顶层命名空间
默认是 app\controllers,一旦用子目录,比如想把后台控制器放在 app\controllers\admin,就不能只写 'controllerNamespace' => 'admin' —— 这会导致 Yii 去找 admin\SiteController,而不是你期望的 app\controllers\admin\SiteController。
- 必须写完整命名空间:
'controllerNamespace' => 'app\controllers\admin' - 如果项目用了自定义基础命名空间(如
myapp\controllers),那子目录控制器就得是myapp\controllers\api\TokenController,且路径为@app/controllers/api/TokenController.php -
controllerNamespace只影响路由自动解析的默认控制器查找范围,不影响render()或redirect()中的手动指定
路由规则里带子目录控制器名时,斜杠要转成连字符
访问 http://localhost/admin/user/index 能命中 app\controllers\admin\UserController::actionIndex(),但前提是路由没被重写。如果你在 urlManager 中启用了 'enablePrettyUrl' => true,默认规则就要求 URL 路径中的层级与控制器命名空间层级一致,且用连字符连接。
- URL
/site/dashboard→ 对应app\controllers\site\DashboardController - URL
/api-v1-posts→ 对应app\controllers\api\v1\PostsController(注意:v1 是子命名空间,不是控制器名的一部分) - 错误写法:
/admin/user/index想映射到app\controllers\Admin\UserController却没配路由规则 → 404,因为默认只认app\controllers下的一级子目录
模块内控制器子目录更常见,但命名空间仍需显式声明
模块(Module)本身自带命名空间隔离,所以 backend/modules/api/controllers/v1/UserController 的类名得是 backend\modules\api\controllers\v1\UserController,而不是套用全局 app\controllers。
- 模块控制器的
controllerNamespace默认继承自模块类的$controllerNamespace属性,不建议覆盖,除非有特殊加载逻辑 - 模块里用子目录(如
v1、v2)时,每个子目录都要有对应的命名空间段,少一段就会 autoload 失败 - 别指望靠
setAlias()把@app/controllers/api指向别的路径来绕过命名空间约束——Yii 的类自动加载器只认 PSR-4 规则下的命名空间到路径映射
最常被忽略的是命名空间大小写和路径大小写的实际差异:Linux 下 app/controllers/Admin 和 app/controllers/admin 是两个目录,但 namespace app\controllers\admin 写成 Admin 就直接报错。命名空间、文件夹名、类名三者大小写必须逐字一致。









