route::resource 自动生成7个标准rest动作路由,严格对应控制器中index、create、save、read、edit、update、delete方法名,不匹配则404;自定义需用->names()映射,中间件和参数规则须链式调用,注意路由顺序与缓存问题。

Route::resource 生成的路由到底对应哪些动作
ThinkPHP 的 Route::resource 不是魔法,它只是按约定批量注册了 7 个标准 REST 动作路由。你写 Route::resource('user', 'User'),框架会自动映射到控制器里固定方法名(index、create、save、read、edit、update、delete),不是你随便起名就能响应的。
常见错误:写了 Route::resource('post', 'Post'),但控制器里只实现了 list() 和 detail() —— 请求 GET /post 直接 404,因为框架在找 index(),不是 list()。
- 必须严格使用默认方法名,否则要手动指定操作映射(见下一条)
-
save对应 POST /resource(创建),update对应 PUT/PATCH /resource/:id(更新),别和表单提交方式搞混 - REST 路由默认不支持
OPTIONS或HEAD,需要额外加->allowCrossDomain()或手动补全
如何自定义 resource 路由的操作方法名
如果你的控制器方法名不符合默认约定(比如用 show() 代替 read()),不能靠改配置全局切换,得在注册时显式绑定动作到方法。
例如:Route::resource('article', 'Article')->only(['index', 'read'])->names(['read' => 'show']),这样 GET /article/5 就会调用 Article::show() 而不是 read()。
-
->names()只改方法名映射,不改 HTTP 方法或路径 -
->except(['create', 'edit'])可以排除不需要的路由(比如纯 API 不需要 HTML 表单页) - 别试图用
->rest(false)关闭 REST 模式——这个参数根本不存在,文档里没写就别乱试
资源路由里的参数绑定和中间件怎么加
Resource 路由生成的每条规则都是独立路由对象,所以中间件、参数验证、域名限制等,得在 resource 实例上调用链式方法,而不是单独给某一条子路由加。
比如想让所有 user 资源接口都走 auth 中间件,且 ID 参数必须是数字:Route::resource('user', 'User')->middleware('auth')->pattern(['id' => '\d+'])。
-
->pattern()是对整个 resource 所有含:id的路由生效,不是只对read生效 - 中间件顺序很重要:如果同时用了
auth和throttle,建议throttle在前,避免未登录用户也触发频率限制 - 不要在控制器构造函数里做鉴权——resource 路由可能跳过构造函数直接进方法(尤其开启路由缓存后)
为什么 Route::resource 注册后部分路由不生效
最常见原因是路由注册顺序冲突:你在 Route::resource('user', ...) 前写了 Route::get('user/:id', ...),那后者会完全屏蔽 resource 生成的 GET /user/:id(即 read 动作)。
另一个隐蔽问题是路由缓存:修改了 route.php 但没清缓存,php think route:clear 必须跑一次,否则新 resource 定义根本没加载。
- 用
php think route:list查看实际注册的路由,确认 method/path/handler 是否符合预期 - 如果用了多应用模式,确保 resource 写在对应应用的
route/app.php里,而不是根目录route.php - REST 路由默认不处理复数/单数转换(比如
users→User控制器),别指望它自动猜——路径名和控制器名必须严格匹配
resource 路由看着省事,但一旦出问题,排查点比手写路由还分散:控制器方法名、路由顺序、缓存、中间件链、参数正则,全得挨个对。别图快一口气全 resource,关键路径先手写几条,稳了再收口。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










