必须使用2021年10月后更新的《ThinkPHP5.1完全开发手册》第7章“API开发”→7.3节,按路由定义(Route::resource)、控制器命名规范(User类+index/read/save等固定方法)、JWT鉴权(扩展或中间件)、参数验证(Validate类)及统一JSON响应四步闭环实现RESTful API。

要快速上手ThinkPHP 5.1开发RESTful API,必须绕过手册中零散的配置说明,直接定位核心路径:从路由定义→控制器分层→资源操作→权限拦截→响应封装,每一步都依赖手册中特定章节的精确引用,跳过无关的模板渲染或命令行工具内容。
确认手册版本与阅读入口
打开官方《ThinkPHP5.1完全开发手册》PDF或在线版,【必须使用2021年10月后更新的版本】,旧版缺失v1/v2版本路由分组、ApiValidate自动注入等关键描述。首页搜索栏输入“RESTful”直达第7章“API开发”,不要从“路由”或“控制器”章节盲查——这两处只讲基础语法,不提资源路由绑定规则。
翻到“7.3 RESTful资源路由”小节,重点划出三行加粗说明:① Resource路由仅支持controller目录下以Resource结尾的类;② 自动生成的index/show/create等方法名不可重写;③ route.php中必须用Route::resource()而非Rule()声明。
初始化RESTful路由结构
在application/route.php中写入:
立即学习“PHP免费学习笔记(深入)”;
Route::resource('v1/user', 'api/v1.User')->except(['create', 'edit']);
这行代码会自动生成GET /v1/user(列表)、GET /v1/user/:id(单条)、POST /v1/user(新增)、PUT /v1/user/:id(更新)、DELETE /v1/user/:id(删除)五条路由。注意【'api/v1.User'中的斜杠不能写成点号,否则容器无法解析命名空间】。
验证是否生效:启动内置服务器php think run,访问http://localhost:8000/v1/user,返回404说明路由未加载;返回空数组说明路由已通但控制器未响应——此时可进入下一步。
创建符合规范的资源控制器
在application/api/v1/目录下新建User.php文件,继承thinkController而非普通Controller:
namespace apppi1;
use thinkController;
class User extends Controller { public function index() { return json(['code'=>200, 'data'=>[]]); } }
关键点:控制器类名必须与路由声明中最后一段一致(此处为User),且必须放在api/v1子目录;方法名严格对应HTTP动词,index→GET,read→GET(带id),save→POST,update→PUT,delete→DELETE。
若将方法名写成getUserList或postAddUser,路由将无法匹配——手册第7.3.2节明确标注:“资源控制器方法名不可自定义,仅允许index/read/save/update/delete”。
接入JWT鉴权中间件
方法一:使用china-wangyu/think-restful扩展
执行composer require china-wangyu/think-restful → 修改application/config/app.php,添加'exception_handle' => '\restful\exception\ApiException' → 在User控制器顶部添加use restfuljwtJwt; → 在index方法开头插入(new Jwt())->check();
方法二:手动集成tp5.1原生Auth中间件
在application/middleware.php中注册中间件:['api/v1.*' => \app\middleware\Auth::class] → 创建application/middleware/Auth.php,其中handle方法调用Token::check()并捕获TokenException → 注意【中间件必须放在api/v1.*路由前缀下,否则/v1/user路由不触发】。
定义参数验证与异常统一返回
第一步:在application/api/v1/validate/下新建UserValidate.php
第二步:继承thinkValidate,定义rule属性为['user_name'=>'require|alphaNum','user_pwd'=>'require|min:6']
第三步:在User控制器的save方法中插入$this->validate($this->request->param(), 'UserValidate');
第四步:修改application/exception_handle.php,将render方法中JsonResponse替换为restful esponseJson::instance()->fail($e->getCode(), $e->getMessage());
这四步完成后,当POST /v1/user提交缺少user_name字段的数据时,接口将立即返回{"code":400,"msg":"user_name不能为空","data":[]},而非默认的HTML错误页。



















