ThinkPHP 6 创建控制器需满足三点:位置在 app/controller/ 下、文件名与类名一致且首字母大写、必须继承 think\Controller 或其子类;否则将导致404、白屏或方法调用失败。

ThinkPHP 6 创建控制器,核心就三点:位置对、命名准、继承对。写错任意一个,轻则 404 或白屏,重则报 ClassNotFoundException 或方法不可调用。
文件位置与命名规范
控制器必须放在 app/controller/ 目录下(多应用模式为 app/应用名/controller/)。文件名和类名严格一致,首字母大写,不带 Controller 后缀:
-
app/controller/User.php→ 类名必须是class User -
app/controller/Admin/Menu.php→ 命名空间为app\controller\admin,类名class Menu - 不能写成
UserController.php或user.php,否则自动加载失败
类定义与继承要求
控制器类必须继承 think\Controller 或项目自定义的基类(如 app\BaseController),否则无法使用 $this->assign()、view()、redirect() 等快捷方法:
- 正确写法:
class User extends \think\Controller或class User extends BaseController - 错误写法:
class User { ... }(无继承)→ 调用$this->assign()会报“未定义方法” - 若使用自定义基类,请确认它已正确继承
\think\Controller
创建方式:手动 or 命令行
推荐用命令行生成,避免手误:
立即学习“PHP免费学习笔记(深入)”;
- 单应用下创建
Blog控制器:php think make:controller Blog - 多应用下创建
admin@Menu:php think make:controller admin@Menu - 生成空控制器(不含默认方法):
--plain参数,例如php think make:controller admin@Menu --plain - 支持多级目录:
php think make:controller api@common/Base --plain(生成app/api/controller/common/Base.php)
方法定义与参数处理
控制器方法默认为 public,且不自动接收 URL 路径参数:
- 访问
/user/detail/123时,public function detail($id)不会自动赋值 —— 这不是 bug,是默认行为 - 获取参数推荐方式:
$this->request->param('id')或input('id') - 如需自动绑定路径变量,需显式配置路由,例如:
Route::get('user/detail/:id', 'User/detail')->option(['merge_param' => true]) - 构造方法
__construct()中不可用$this->request;初始化逻辑请写在initialize()方法里



















