route:cache仅缓存routes/web.php和routes/api.php中的静态闭包路由,生成bootstrap/cache/routes-v7.php预编译数组,跳过动态注册、条件判断及注释,不兼容含闭包、类型提示错误、未绑定依赖或运行时函数的路由。
route:cache 命令到底缓存了什么
它只缓存 routes/web.php 和 routes/api.php 中的**静态闭包路由定义**,不处理动态注册(比如在服务提供者里用 Route::macro() 或循环生成的路由),也不包含 routes/channels.php 或 routes/console.php。
缓存后,Laravel 启动时不再逐行执行路由文件,而是直接加载一个预编译的 PHP 数组文件 bootstrap/cache/routes-v7.php(版本号随 Laravel 变化)。
- 只有
APP_ENV=production且APP_DEBUG=false时,框架才默认启用路由缓存逻辑 -
开发环境运行
php artisan route:cache会成功,但下次php artisan serve启动时可能因缓存未刷新而 404 - 缓存文件里没有注释、没有条件判断——所有
if (app()->environment('local')) { ... }这类逻辑都会被跳过
哪些路由写法会导致 route:cache 失败或失效
常见报错是 Unable to prepare route [xxx] for serialization. Uses Closure.,本质是 Laravel 无法序列化闭包。以下写法全部不兼容:
- 路由回调用闭包:
Route::get('/test', function () { return 'ok'; }); - 控制器方法带参数类型提示但类未自动加载(如写错命名空间,导致反射失败)
- 使用了未在容器中绑定的依赖,例如
Route::get('/', [SomeController::class, 'index'])->middleware(CustomMiddleware::class);而CustomMiddleware没有正确注册 - 路由中调用了运行时函数,如
Route::get('/time', function () { return now(); });
检查方法:运行 php artisan route:list --compact 看是否所有路由都显示为控制器方法格式(App\Http\Controllers\XController@y),而不是 Closure。