Route::resource() 一句生成7条标准路由,但需控制器严格实现index、create、save、read、edit、update、delete七方法;错误命名、继承基类不当、路由注册位置错误、路径前缀误用、参数获取方式混淆及create/edit冗余等问题均会导致路由失效或行为异常。

Route::resource() 一句就够了,但控制器方法名不能错
ThinkPHP资源路由不是靠写一堆 Route::get() 或 Route::post() 拼出来的,核心就是调用 Route::resource()。它会按约定自动生成 7 条标准路由,但前提是控制器里必须存在且仅存在这 7 个方法:index、create、save、read、edit、update、delete。
常见错误现象包括:
- GET /users/5 走到
index方法(而不是read),说明控制器没实现read,或方法名写成了show - DELETE /users/5 报 “方法不存在”,其实是控制器继承了
think\BaseController,而资源路由依赖think\Controller(TP6)或think\controller\AbstractController(TP8)来触发__call拦截 - 路由注册后访问 404,大概率是没在
app/route/app.php中写,或者文件顶部漏了use think\facade\Route;
路径前缀别硬塞进 resource 第一个参数里
想让资源路由跑在 /api/v1/users 下,不要写成 Route::resource('api/v1/users', 'User')——这样会导致框架尝试解析 v1 为控制器参数,最终报错或路由失效。
正确做法是用分组包裹:
- 带版本前缀:
Route::prefix('api/v1')->group(function () { Route::resource('users', 'User'); }); - 绑定子域名:
Route::domain('api.example.com')->group(function () { Route::resource('users', 'User'); });(注意:TP5 需先在config/app.php开启'url_domain_deploy' => true) - 命名路由方便生成地址:
Route::resource('users', 'User')->name('api.users'),之后可用url('api.users/read', ['id' => 5])
POST/PUT/DELETE 请求收不到参数?save/update/delete 里得自己取
Route::resource() 只负责把 URL 和 HTTP 方法映射到控制器方法,不自动填充数据。很多新手卡在 $this->request->post() 为空,其实是因为:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 前端发的是 JSON(
Content-Type: application/json),得用$this->request->param(),不是post() - 表单 POST 提交时,
$this->request->post()才有效;但 TP6+ 默认 trim 字段值,首尾空格会被清掉 - 没开
app_debug = true且未配置default_ajax_return,JSON 请求体可能被静默丢弃 -
save方法对应 POST /users(创建),update对应 PUT/PATCH /users/:id(更新)——别指望框架自动区分“新建”和“编辑”逻辑
纯 API 场景下,create/edit 是累赘,该砍就砍
资源路由默认包含 create(GET /users/create)和 edit(GET /users/:id/edit),这两个是为 HTML 表单页设计的,在纯 RESTful API 里毫无意义,还占路径、增攻击面。
别依赖 ->only() 去筛(TP6 不支持数组传参,TP8 支持但易出错),直接弃用 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');
这样控制器不用写 create 和 edit,URL 路径语义清晰,中间件、参数约束也能逐条控制——资源路由省事,但省过头就埋坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










