yii 2.0 命名规范要求控制器类名用 pascalcase + controller 后缀、文件名严格匹配类名并置于 @app/controllers/,模型类名 pascalcase 无后缀、文件名一致且放于 @app/models/,视图文件全小写连字符分隔;三者大小写各自独立又环环相扣。

控制器类名必须用 PascalCase + Controller 后缀
Yii 2.0 的自动路由机制依赖类名严格匹配 URL 路径,SiteController 对应 /site/index,UserAdminController 对应 /user-admin/index。小写开头(如 siteController)或漏掉 Controller(如 Site)会导致 404 或 “Class not found” 错误。
常见错误现象:Invalid Parameter – yii\base\InvalidParamException 提示 “Unable to find ‘xxx’ controller”,其实只是类名没按规范命名。
- 类文件必须放在
@app/controllers/下,且文件名 = 类名 +.php(如SiteController.php) - 类名中连字符(
-)在 URL 中会转为驼峰,但控制器类名本身不能含连字符——User-Admin是非法类名,必须写成UserAdminController - 大小写敏感:Linux 环境下
sitecontroller.php(全小写)无法被自动加载,即使类定义是class SiteController
模型类名必须用 PascalCase,不加后缀
模型类不强制要求后缀,但约定俗成用单数、PascalCase 形式,比如 User、UserProfile、OrderItem。Yii 的 ActiveRecord 机制通过类名推导表名(User → user),大小写错乱会直接导致查询报错或查不到数据。
使用场景:在控制器里调用 User::find()->one(),如果类名写成 user 或 userModel,PHP 会报 Class 'user' not found;若类名正确但文件名是 user.php(小写),在 Linux 下同样加载失败。
- 模型文件放在
@app/models/,文件名必须与类名完全一致(User.php对应class User) - 表名推导默认转为小写+下划线,
UserProfile→user_profile;若实际表名是userProfile,需在模型中重写tableName()返回'userProfile' - 避免用数字开头(
3rdPartyLog)或保留字(Array、Object)作类名,PHP 解析会失败
视图文件名和路径必须全小写 + 连字符分隔
控制器动作渲染视图时,默认找 @app/views/控制器ID/动作ID.php,其中控制器 ID 和动作 ID 都是 URL 中的小写连字符格式,和类名无关。比如 UserAdminController::actionCreateUser() 对应视图路径是 @app/views/user-admin/create-user.php,不是 createUser.php 或 CreateUser.php。
常见错误现象:页面空白或 View not found,但控制器和模型都没问题——八成是视图文件名用了驼峰或大小写混搭。
- 控制器 ID 来自类名去掉
Controller后按 PascalCase 拆分并转小写连字符:UserAdminController→user-admin - 动作 ID 是方法名去掉
action前缀,首字母小写后按驼峰拆分:actionCreateUser()→create-user - 视图文件扩展名必须是
.php,不能是.html或.twig(除非显式配置模板引擎)
命名冲突时优先服从自动加载规则,而非“看着顺眼”
Yii 2.0 的 ClassMap 和 PSR-4 自动加载器对大小写极其敏感,尤其在生产环境部署到 Linux 服务器时,Windows 下能跑的 user.php + class User 会直接挂掉。
性能影响很小,但兼容性风险极高:一次命名不一致,可能表现为开发环境正常、测试环境报错、线上 500,排查时容易绕远路去查数据库或中间件。
- 统一用
vendor/bin/yii serve在本地模拟 Unix 文件系统行为,提前暴露大小写问题 - CI 流程中加入检查脚本,扫描
@app/controllers/和@app/models/下文件名是否与类名完全一致(可用grep "class " *.php | sed 's/class //; s/{.*//'辅助比对) - 别为了“语义清晰”在类名里加下划线(
User_Profile)或缩写(usr),Yii 不识别,PHP 也不认









