ThinkPHP控制器创建需严格遵循路径、命名、继承和路由四点约定:文件置于app/controller/下,首字母大写;类名同文件名且继承BaseController;命名空间为app\controller;路由需显式配置或使用命令行生成。

ThinkPHP 创建控制器不是简单建个文件就行,关键在路径、命名、继承和路由四点对齐框架约定。错一个,就报 Class not found 或静默失败。
文件位置和命名必须严格匹配
控制器文件必须放在 app/controller/ 目录下(多应用模式则是 app/应用名/controller/)。文件名首字母大写、不带后缀,类名与之完全一致。
- 想访问
/user/login→ 文件名是User.php,不是user.php、UserController.php或UserController - 类定义必须是
class User extends BaseController,不能漏掉extends BaseController - 命名空间固定为
app\controller(多应用时如app\index\controller)
必须继承 BaseController 才能用常用方法
没继承就调不了 $this->assign()、$this->fetch()、$this->redirect(),会直接报“Call to undefined method”。
- 推荐继承项目默认的
app\BaseController(TP6 标准写法) - 兼容写法可继承
\think\Controller,但会丢失部分项目级封装 - 初始化逻辑别写在
__construct()里——$this->request等对象此时还没注入,应改用initialize()方法
方法参数不会自动从 URL 填入
写 public function detail($id),直接访问 /user/detail/123 是拿不到 $id 的。这不是 bug,是默认行为。
立即学习“PHP免费学习笔记(深入)”;
- 要取路径参数,得显式配置:比如在
config/route.php中设'url_param_type' => 1,或注册带变量的路由Route::get('user/detail/:id', 'User/detail') - 也可用依赖注入方式:
public function detail(\think\Request $request),再调$request->param('id') - GET 参数统一用
input('name')或$this->request->get('name'),不靠函数参数直传
快速生成推荐用命令行
手动创建容易手误,建议用内置命令:
- 确保已启用
think\command\MakeController(TP6.1+ 默认已配好;TP6.0 需先composer require topthink/think-helper) - 运行:
php think make:controller User/UserController→ 生成app/controller/User/UserController.php,类名为UserController - 注意格式:不能写
UserController(会生成UserControllerController),也不能带.php后缀
生成完别忘了配路由,不然访问不到。基本上就这些。



















