必须在生产环境且路由全为控制器定义时执行php artisan route:cache启用,闭包路由需全部移至控制器,修改路由后须先route:clear再重新缓存。

路由缓存必须开,但不能盲目开——它只对标准闭包以外的路由定义生效,且一旦开启,routes/web.php 和 routes/api.php 的任何修改都不会实时反映,必须重新生成。
route:cache 命令执行前必须满足的条件
这个命令不是“点了就跑”,它会在生成缓存前做静态检查,不达标直接报错退出:
-
Route::get('/home', function () { return view('home'); });这类匿名函数路由会被拒绝,必须改写为控制器方法引用,例如Route::get('/home', [HomeController::class, 'index']); - 所有路由闭包(包括
Route::fallback()里的)都得移除或替换 - 确保没有在路由定义中动态拼接字符串(如
Route::get($dynamicPath, ...)),变量名本身也得是字面量 - 第三方包注册的路由(比如
laravel/sanctum)通常已适配,但自定义服务提供者里手动require路由文件的,要确认路径稳定、无运行时逻辑
生成与验证缓存是否真正生效
执行 php artisan route:cache 后,它会把全部路由编译成 PHP 数组并写入 bootstrap/cache/routes-v7.php(Laravel 10+ 是 routes-v9.php)。但光有文件不等于生效:
- 检查
APP_ENV=production是否已设 —— 开发环境下该命令默认禁用,除非加--force - 访问任意 URL 后,在 Tinker 中运行
Route::getRoutes(),返回实例类型应为Illuminate\Routing\CachedRouteCollection,而不是基类RouteCollection - 清掉
bootstrap/cache/routes-*.php再试一次,确认错误信息是否消失,避免残留旧缓存干扰判断
缓存失效后如何安全更新
改了路由别手抖去删缓存文件,要用命令闭环操作:
- 先运行
php artisan route:clear,它会删掉bootstrap/cache/routes-*.php并重置内部状态 - 再改
routes/web.php,确保符合前述条件 - 最后运行
php artisan route:cache,失败就看报错行号,定位到具体哪条路由违规 - 注意:
route:clear不影响config:cache或view:cache,它们得各自清理
最常被忽略的一点:缓存路由后,Route::current() 返回的 Route 实例不再带原始定义上下文(比如没 ->action['controller'] 字段),调试时若依赖这个字段做逻辑分支,会静默出错。上线前务必查一遍中间件和异常处理器里有没有硬依赖路由对象结构的地方。











