ThinkPHP 6 的 make:controller 不支持 --api 参数,需手动创建 api/User.php、显式注册 Route::resource('user', 'api.User')、严格命名方法、返回 json() 响应。

ThinkPHP 6 的 make:controller 不支持 --api 或 --resource
直接运行 php think make:controller User --api 会报错:Unknown option --api。这不是你本地环境问题,是 ThinkPHP 6.x 官方命令压根没实现这个参数——它只负责建文件和类壳,不生成 REST 方法体,也不自动注册路由。
常见错误现象包括:命令执行失败、控制器里空空如也、访问 /user 返回 404。
- 正确做法是用命名空间前缀:运行
php think make:controller api/User,生成路径为app/controller/api/User.php - 类名需手动改为
UserController extends BaseController(确保BaseController已禁用视图,例如设置$this->view = null) - 别指望它帮你写
index()、save()等方法——这些必须自己补全
资源路由必须显式注册在 app/route/app.php 中
Route::resource('user', 'api.User') 这行代码不能丢,也不能放在中间件分组或子域名路由里,否则资源映射失效。
容易漏掉的兼容性细节:
立即学习“PHP免费学习笔记(深入)”;
- 路由必须写在
app/route/app.php(不是api.php或其他文件),且未被Route::domain()、Route::middleware()包裹 - 控制器方法名必须严格为
index、read、save、update、delete—— 写成list或show就不会被匹配 - 若启用多应用模式,需确认
api是合法应用名(检查app/multi.php是否已配置)
控制器返回 JSON 响应必须手动处理
ThinkPHP 默认可能输出 HTML 或空内容,REST 接口必须显式返回 JSON 格式数据,否则前端收不到结构化响应。
典型错误:调用 return $data 或 echo json_encode(...) 但没设 header,导致 Content-Type 错误或跨域拦截。
- 统一用
return json(['code' => 0, 'data' => $data]),它会自动设置Content-Type: application/json - 不要用
echo+header()混合输出,易遗漏 header 或触发 headers already sent 错误 - 如果用了自定义基类,确保没在构造函数或初始化逻辑中调用
$this->fetch()或其他视图渲染方法
RESTful 接口生效依赖四要素对齐
少一个就 404 或 500:路由注册、控制器位置、方法命名、返回格式。尤其容易忽略的是「控制器路径」与「路由字符串」的对应关系——Route::resource('user', 'api.User') 要求类文件在 app/controller/api/User.php,类名为 UserController,命名空间为 app\controller\api。
调试时建议逐项验证:
- 执行
php think route:list查看user相关路由是否真实存在并指向api.User - 用
curl -I http://your.dev/user检查状态码和 header - 在控制器方法开头加
halt('hit');,确认是否进到目标方法
真正省事的方式不是等框架补全功能,而是维护一个最小可用的 API 控制器模板,复制后只改类名和资源名。



















