laravel资源路由是封装标准crud操作的语法糖,自动生成index、create、store、show、edit、update、destroy七种路由;适用于遵循默认命名和http映射的常规模型管理场景,不适用方法名非标、动作精简或路径/中间件需高度定制的情况。

index、create、store、show、edit、update、destroy 这 7 个常见操作对应的路由。如果你的控制器确实按这个节奏工作(比如管理文章、用户、订单),用它省事;否则硬套反而别扭。
什么时候该用 Route::resource()
适合标准 CRUD 场景,且你愿意接受默认命名和 HTTP 方法映射:
-
GET /posts→PostController@index -
GET /posts/create→PostController@create -
POST /posts→PostController@store -
GET /posts/{id}→PostController@show -
GET /posts/{id}/edit→PostController@edit -
PATCH/PUT /posts/{id}→PostController@update -
DELETE /posts/{id}→PostController@destroy
注意:Laravel 10+ 要求显式写完整控制器类名,比如 [\App\Http\Controllers\PostController::class, 'index'],不能再只写 'PostController@index'。
什么时候不该用 Route::resource()
以下情况建议手动定义单个路由:
- 控制器方法名不标准(比如叫
listAll()或fetchForDashboard()) - 不需要全部 7 个动作(例如只读列表 + 查看详情,没有创建或删除)
- URL 路径要自定义(比如
/admin/articles而非/posts,且不想靠->names()或->parameters()补救) - 某些动作需额外中间件(如
destroy需can:delete,post,而其他动作不需要)——虽然能用->middleware()局部加,但代码会变臃肿
Route::resource() 的常见踩坑点
实际写的时候容易忽略这些细节:
- 默认不带
web中间件组,如果在routes/web.php里用,没问题;但若在routes/api.php里误用,session、csrf_token就失效了 - 模型绑定自动启用,比如
/posts/{post}会尝试解析Post模型,如果没配好Route::bind()或模型主键不是id,show和edit会 404 - 生成的命名路由(如
posts.index)一旦项目做大,多人协作时容易冲突或记混,尤其当有多个 resource 嵌套时(users.posts.indexvsposts.index) - Laravel 10+ 移除了默认命名空间,必须提前
use控制器类,否则Route::resource('posts', PostController::class)会报错
resource 改回手动路由,就是因为某天发现 edit 页面要加权限判断,或者 store 要支持多格式提交,而资源路由的扩展性刚好卡在临界点。











