路由分组是最常用、最清晰的方式,可统一应用中间件、前缀、命名等配置,支持嵌套与动态前缀,提升可读性与可维护性。

直接用路由分组(Route Group)是最常用、最清晰的方式。它能一次性给多个路由统一应用中间件,避免重复写 ->middleware(),结构干净,维护也方便。
用 Route::middleware() 包裹整个分组
这是最标准的做法:调用 Route::middleware() 后接 ->group(),把所有需要该中间件的路由放进闭包里。
- 中间件会自动作用于分组内所有子路由,包括
get、post、resource等 - 支持多个中间件,按顺序执行,例如
['auth', 'verified', 'throttle:60,1'] - 可与其他分组属性组合使用,比如前缀、命名空间、路由名称前缀
示例:
Route::middleware(['auth', 'verified'])->group(function () {<br>
Route::get('/profile', [ProfileController::class, 'show'])->name('profile.show');<br>
Route::put('/profile', [ProfileController::class, 'update'])->name('profile.update');<br>
Route::resource('posts', PostController::class)->except(['create', 'edit']);<br>
});
配合 prefix 或 name 实现更实用的分组
实际项目中,加中间件往往和路径前缀、路由命名逻辑强相关。Laravel 允许链式调用多个配置方法,一次写全。
-
->prefix('admin')统一添加 URL 前缀,比如所有后台路由都以/admin/xxx开头 -
->name('admin.')统一路由名称前缀,模板中可用route('admin.dashboard') - 这些方法顺序无关,但建议按 middleware → prefix → name → group 的习惯写法,语义更顺
示例:
Route::middleware(['auth', 'role:admin'])<br>
->prefix('admin')<br>
->name('admin.')<br>
->group(function () {<br>
Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');<br>
Route::resource('users', UserController::class);<br>
});
嵌套分组实现权限叠加
当某些路由需要“基础校验 + 额外限制”时(比如先登录、再判断角色),可以用嵌套分组,让中间件逐层生效。
- 外层加
auth,保障所有子路由已登录 - 内层再加
role:admin,只对特定子集强化控制 - 比在每个路由上手动叠加更易读,也利于后期抽离或开关某一层逻辑
示例:
Route::middleware(['auth'])->group(function () {<br>
Route::get('/settings', [SettingController::class, 'index'])->name('settings.index');<br><br>
Route::middleware(['role:admin'])->group(function () {<br>
Route::get('/admin/logs', [LogController::class, 'index'])->name('logs.index');<br>
Route::delete('/admin/clear-cache', [CacheController::class, 'clear'])->name('cache.clear');<br>
});<br>
});
多语言或 API 版本等动态前缀场景
像带 {locale} 或 api/v1 这类通用前缀的路由,同样适用分组+中间件组合。
- 用
prefix('{locale}')或prefix('api/v1')定义动态或固定前缀 - 配套加语言检测中间件或 API 认证中间件(如
throttle、auth:sanctum) - 确保所有带该前缀的请求都走同一套预处理流程
示例(多语言):
Route::prefix('{locale}')->middleware('set.locale')->group(function () {<br>
Route::get('/', [HomeController::class, 'index'])->name('home');<br>
Route::get('/about', [PageController::class, 'about'])->name('page.about');<br>
});
其中 set.locale 是自定义中间件,负责解析 {locale} 并设置 App 语言。











