路由分组必须使用 route::group(),其配置数组需包含 middleware、prefix、as 等键;闭包内路由自动继承前缀与中间件;嵌套分组会拼接 prefix;路由缓存后需手动清缓存(route:clear)以生效修改。

路由分组必须用 Route::group(),不能直接写数组
很多人试过把中间件、前缀这些参数塞进一个数组传给 Route::get(),结果报错或不生效。Laravel 的路由分组机制只认 Route::group() 这个入口,其他方式都不触发分组逻辑。
常见错误现象:Route::get(['prefix' => 'api'], ...) 完全无效;或者把中间件写在闭包外,导致整个应用都套上中间件。
-
Route::group()第一个参数是配置数组,必须包含middleware、prefix、as等键,不能漏掉[] - 闭包里写的路由(比如
Route::get('users', ...))会自动继承分组的prefix和middleware - 如果分组里嵌套了另一个
Route::group(),前缀会拼接,比如外层prefix => 'api',内层prefix => 'v1',最终路径是/api/v1/xxx
prefix 参数只影响子路由 URI,不影响命名或中间件
prefix 是纯路径前缀,它不会自动给路由名加前缀,也不会改变中间件执行顺序。想让路由名也带前缀,得手动配 as;想控制中间件执行时机,得看中间件本身是否支持分组作用域。
使用场景:API 版本隔离(prefix => 'api/v2')、后台模块划分(prefix => 'admin/users')、多语言路由(prefix => '{locale}')。
-
prefix值开头不加/,Laravel 会自动补;但结尾也不加/,否则生成的 URL 会出现双斜杠 - 动态段如
{id}可以放在prefix里,但要确保后续路由没重复定义同名参数 - 如果同时用了
prefix和as,命名空间不会自动拼接,as => 'admin.'+get('dashboard')才生成admin.dashboard
中间件在分组里写错位置,会导致部分路由不走中间件
中间件必须写在分组配置数组里,而不是丢在闭包外面或单个路由上——否则容易漏掉某些路由,尤其是后期加的新路由。
常见错误现象:登录校验中间件只对第一个 Route::get() 生效,后面的 Route::post() 没校验;或者中间件顺序混乱,auth 跑在 throttle 后面,导致未登录用户也被限流。
- 多个中间件用数组传入:
['middleware' => ['auth', 'can:manage-users']] - 带参数的中间件写成字符串:
'throttle:60,1',不要写成数组或调用形式 - 如果分组里混用了
Route::resource(),它的 7 个方法都会继承该中间件,这点比手写每个路由更省心也更易统一
路由缓存后改了分组配置,本地测试正常但线上 404
运行 php artisan route:cache 后,所有路由定义被固化成 PHP 数组。此时修改 routes/web.php 或 routes/api.php 里的分组结构(比如删了 prefix、改了 as),缓存不会自动更新。
性能影响:缓存能显著提升路由匹配速度,尤其路由数超过 200 条时;但开发阶段频繁改分组,建议关掉缓存或每次改完手动清掉。
- 清缓存命令:
php artisan route:clear,不是config:clear或cache:clear - 部署脚本里如果自动跑了
route:cache,要确认 CI/CD 流程中路由文件已同步完成,否则缓存的是旧结构 - 带闭包的路由(比如用
function () { ... }定义控制器逻辑)无法被缓存,分组里混用闭包会让整条缓存失效
prefix 拼接规则和缓存时效性——前者让路径变得难以追踪,后者让问题只在线上爆发,且很难复现。










