thinkphp资源路由硬编码绑定7个方法名:index、create、save、read、edit、update、delete,控制器必须严格使用这些名称且继承think\controller,否则路由失效;api项目建议显式注册路由而非使用route::resource()。

ThinkPHP资源路由固定绑定7个方法名
Route::resource() 不是“智能匹配”,它硬编码绑定了7个特定方法名,控制器里必须严格叫这些名字,少一个、拼错一个、大小写不对,对应路由就失效。框架不会帮你纠错,只会抛出“方法不存在”异常。
-
index:对应 GET /users,列表页或API首页 -
create:对应 GET /users/create,纯表单场景用,API项目通常不用 -
save:对应 POST /users,创建新资源——注意不是store,别被 Laravel 带偏 -
read:对应 GET /users/:id,查单条记录——不是show -
edit:对应 GET /users/:id/edit,返回编辑页HTML,API应主动排除 -
update:对应 PUT 或 PATCH /users/:id,更新已有资源 -
delete:对应 DELETE /users/:id,删除资源
控制器必须继承 think\Controller(不是 think\BaseController),否则 __call 拦截器不生效,方法名对了也进不去。
为什么你的 show 或 destroy 方法没被调用
常见错误现象:写了 show() 方法,但访问 /users/5 还是进 index();或者 delete() 写成 destroy(),DELETE 请求直接 404。
根本原因就是方法名不匹配约定。ThinkPHP 资源路由不支持自定义动作映射,它只认这7个字面量。你改名,它就不认。
- 不要试图在控制器里写
show()替代read(),哪怕逻辑一样也要重命名 -
delete()是唯一合法的删除方法名,destroy()在 ThinkPHP 里完全无效 - 方法必须是 public,且不能带额外参数(ID 由路由自动注入)
POST /users 的数据怎么取?save() 不自动解析
save() 方法不会像模型那样自动填充或调用 input(),它什么也不做,全靠你手动取参。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 表单提交:用
$this->request->post(),但注意 TP6+ 默认 trim 首尾空格,可能误清空字段 - JSON 提交:必须设
Content-Type: application/json,然后用$this->request->param()(不是post())才能正确解析 - 如果
$this->request->param()返回空,检查app_debug = false时是否漏配default_ajax_return,会导致 JSON body 被丢弃
纯 API 场景建议绕开 Route::resource()
资源路由默认包含 create 和 edit 这两个面向 HTML 表单的动作,它们在纯 API 中毫无意义,还占路径、增维护成本。
更干净的做法是放弃 Route::resource(),显式注册你需要的那几条:
Route::get('users', 'User@index');
Route::post('users', 'User@save');
Route::get('users/:id', 'User@read');
Route::put('users/:id', 'User@update');
Route::patch('users/:id', 'User@update');
Route::delete('users/:id', 'User@delete');
这样路径语义清晰,中间件可单独加,控制器不用实现无用方法,也避免了 only()/except() 的隐式控制带来的理解负担。
真正容易被忽略的是:资源路由的“RESTful”只是表面结构,行为是否符合 REST 语义,全看控制器里怎么写响应格式、状态码和错误体——框架本身不管这些。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










