route::resource() 生成 restful 路由需严格匹配七种方法名(index/save/read/edit/update/delete)、参数签名、控制器继承关系及请求解析方式,任意一项不一致即导致404或逻辑错误。

Route::resource() 一句就能生成标准 RESTful 路由,但默认行为和常见预期不一致——不是“写了就跑通”,而是“写了还得对得上七件事”。
Route::resource() 映射的 7 个方法名必须严格为 index/create/save/read/edit/update/delete
ThinkPHP 不识别 show、store、destroy 这类 Laravel 风格命名。写错一个,对应路径就会进错方法或 404。
-
GET /users→ 必须是index(),不是indexAction()或list() -
POST /users→ 必须是save(),不是store();否则表单提交永远进不了创建逻辑 -
GET /users/123→ 必须是read($id),参数名必须叫$id(或带类型提示如int $id),否则路由无法绑定 -
PUT /users/123和PATCH /users/123都走update(Request $request, $id),不能只写update($id),否则请求体取不到 -
DELETE /users/123→ 必须是delete($id),别写成destroy($id)
控制器必须继承 think\Controller(不是 think\BaseController),否则 __call() 拦截失效,资源方法直接报错“method not exists”。
POST /users 的 save() 方法里必须手动取参,不能依赖自动填充
save() 是唯一一个不带 ID 参数、且不自动解析请求体的方法。框架不会帮你调用 input() 或 param(),你得自己来。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 表单提交(
Content-Type: application/x-www-form-urlencoded):用$this->request->post()或$this->request->param() - JSON 提交(
Content-Type: application/json):必须用$this->request->param(),post()会返回空 - 注意
app_debug = false时,若没配default_ajax_return,JSON 请求可能被静默丢弃,param()始终为空 - TP6+ 默认对字符串参数做
trim(),首尾空格字段会被清空——如果业务需要保留,得在验证器或中间件里关掉
API 场景下必须排除 create 和 edit 路由
纯接口项目不需要 GET /users/create 和 GET /users/123/edit 这两个 HTML 表单页路由。它们不仅无用,还暴露冗余路径,可能被扫描器误触,甚至干扰前端路由。
- 不要手动删路由规则,而是用
only()显式声明需要的动作:Route::resource('users', 'User')->only(['index', 'read', 'save', 'update', 'delete']) - 避免用
except()排除,因为未来升级加了新动作,except(['create', 'edit'])可能漏掉新增的无意义路由 - 如果用了
prefix('api/v1'),确保前缀不参与控制器解析——Route::prefix('api/v1')->group(function () { Route::resource('users', 'User')->only([...]); });是安全的;但Route::resource('api/v1/users', 'User')会导致控制器找不到v1段
URL 生成和命名容易踩的坑:html 后缀、大小写、命名空间
Route::resource() 拼接 URL 完全按字面量来,不自动加 /api、不转小写、也不处理 .html 后缀。所谓“地址不对”,八成是配置和路由声明没对齐。
- 启用了
url_html_suffix = '.html'?那url('users/read', ['id'=>5])会生成/users/5.html,和 RESTful 语义冲突,建议关闭 - 启用了
url_convert = true(默认开)?路径里的user_info会被转成user-info,但资源路由只认下划线命名法,别混用 - 给路由命名方便生成地址:
Route::resource('users', 'User')->name('api.users'),之后可用url('api.users/read', ['id'=>5]) - 控制器命名空间必须和路由注册位置匹配。比如
Route::resource('users', 'api/User')对应的是app\api\controller\User,不是app\controller\User
真正卡住人的从来不是“怎么写 resource”,而是控制器方法名、参数签名、请求体解析、路由前缀这四点没对齐。少检查一项,请求就进错方法或拿不到数据。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










