ThinkPHP 6控制器文件名与类名必须严格一致且首字母大写、不带Controller后缀,如User.php对应class User;须继承BaseController才能使用assign()等方法;URL参数需依赖注入、开启自动绑定或显式路由配置。
ThinkPHP控制器文件名和类名必须严格匹配
ThinkPHP 6 要求控制器类名与文件名完全一致,且首字母大写、不带
后缀(但类名本身要带)。比如想访问
,对应控制器文件路径是
,类名必须是
,不能是
或
。
常见错误现象:
报错,提示找不到
类;或者路由能进但方法调用失败,实际是自动加载器没找到类。
文件路径必须是
(TP6 默认命名空间是
)
类定义必须是
,不能写成
如果用了多应用模式,路径会变成
,命名空间也得同步改成
控制器方法默认必须是 public 且不能带参数(除非显式绑定)
ThinkPHP 的 URL 访问机制默认只支持无参的 public 方法。例如
可以通过
访问;但
直接访问
会报错或参数为空——这不是 bug,是框架默认不自动解析 URL 参数到方法形参。
使用场景:你希望用
传参,而不是写成
。
立即学习
“
PHP免费学习笔记(深入)
”;
方案一:用依赖注入,在方法签名里写
,再手动取
方案二:启用方法参数自动绑定,在
中设置
,并确保路由规则允许(推荐配合 route 注册)
方案三:显式定义路由,如
继承 BaseController 才能用 $this->assign() 和模板渲染
很多新手直接写
然后在方法里调用
,结果报
。这是因为
、
、
这些快捷方法只在
或其子类(如 TP6 默认的
)中可用。
性能影响:不继承 BaseController 就无法使用内置视图集成,只能手动引入 View 类,代码冗余且易出错。
必须让控制器类继承
(TP6 推荐)或
(兼容写法)
如果自定义了
,记得检查它是否已正确继承
默认找的是
(小写+下划线转短横线),不是
同名模板
命令行创建控制器最不容易出错
手写控制器容易漏掉命名空间、继承、use 引入,尤其在多应用或模块化项目里。ThinkPHP 自带的
命令能生成结构正确的骨架。
示例:
会生成
,含标准命名空间、继承和空方法。
路径参数带斜杠表示层级,
≠
,后者默认在根 controller 目录
加
参数可跳过继承
(极少需要)
别用 IDE 自动补全生成类——它不知道 TP 的命名约定,常把类名补成
最容易被忽略的是路由与控制器的耦合关系:即使控制器文件存在、类能加载,如果没配路由或路由规则不匹配,照样 404。调试时先确认
是否列出目标路由,再查控制器定义。
Controllerhttp://site.com/index/user/loginapp/controller/User.phpUserUserControlleruserClassNotFoundExceptionapp\controller\Userapp/controller/XXX.phpapp\controllerclass XXX extends BaseControllerclass XXXControllerapp/index/controller/XXX.phpapp\index\controllerpublic function login()/user/loginpublic function detail($id)/user/detail/123/user/detail/123?id=123public function detail(\think\Request $request)$request->param('id')config/route.php'url_param_type' => 1Route::get('user/detail/:id', 'User/detail')->option(['merge_param' => true])class User$this->assign()Call to undefined methodassign()fetch()redirect()think\Controllerapp\BaseControllerapp\BaseController\think\Controllerapp\BaseController\think\Controller$this->fetch()view/user/login.htmlUser.phpphp think make:controllerphp think make:controller index/Userapp/index/controller/User.phpindex/UserUser--plainBaseControllerUserControllerphp think route:list