laravel 11核心是“减包袱、显式化”:合并routes.php、移除app/http/kernel.php和app/providers目录,中间件与路由统一收口至bootstrap/app.php,迁移默认添加default(now())但需注意数据库兼容性。

Laravel 11 不是“功能更多了就能直接用”,而是把默认结构砍掉一大半,你得先接受它不给你铺路——routes/web.php 和 routes/api.php 合并成一个 routes.php,app/Http/Kernel.php 没了,app/Providers 目录也不见了,连 config/session.php 这类文件都得手动加回来。升级或新建项目前,必须按新约定重写入口逻辑。
路由文件只剩 routes.php 怎么写
旧项目里习惯分开维护 Web 和 API 路由?Laravel 11 强制统一入口。所有路由定义都在 routes.php 中,靠 Route::middleware() 区分用途:
-
Route::get('/')默认走 Web 中间件栈(如web),不需要额外包裹 - API 路由需显式指定中间件:
Route::middleware('api')->get('/users', [UserController::class, 'index']) - 不再支持
Route::prefix('api')自动注入中间件,必须手动绑定api组 - 如果你依赖
Route::apiResource(),它仍可用,但底层中间件不会自动挂载,得自己补上->middleware('api')
bootstrap/app.php 变成核心配置入口
以前在 app/Http/Kernel.php 里注册中间件、定义中间件组?现在全挪到 bootstrap/app.php。这个文件不再是“启动引导”,而是真正的应用内核定义点:
- 中间件注册改用
withMiddleware()方法链式调用:$app->withMiddleware(function (Middleware $middleware) { $middleware->web(…); }) - 中间件组(如
web、api)必须在这里显式声明,否则路由里引用会报错Middleware group [api] does not exist -
app/Providers下的AppServiceProvider依然存在,但它的boot()方法不会自动执行——得手动在bootstrap/app.php中调用$app->register(AppServiceProvider::class) - 别漏掉
$app->withExceptions(),否则自定义异常处理器(比如App\Exceptions\Handler)不会生效
迁移文件里 default(now()) 不是万能的
新生成的迁移默认给 created_at 和 updated_at 加了 ->default(now()),看起来很贴心,但实际有坑:
- MySQL 5.6 及以下版本不支持函数作为列默认值,会直接报错
Invalid default value for 'created_at' - PostgreSQL 需要写成
->useCurrent()或->default(DB::raw('CURRENT_TIMESTAMP')),now()在某些驱动下会被转成字符串字面量 - 如果表已有数据,
default(now())不会影响存量行,只对后续 INSERT 生效;想补全历史记录,还得手写DB::table()->update(['created_at' => now()]) - 使用
Schema::create()时,timestamps()方法已自动包含该默认值,无需重复写;但Schema::table()新增时间字段时,必须手动加->default(now()),否则字段为 NULL
app/Console.php 注册命令和调度要重写
旧版的 app/Console/Kernel.php 彻底移除,所有 Artisan 命令和调度逻辑都收口到 app/Console.php:
- 命令注册改用
commands()函数:commands(__DIR__.'/Commands');或单个注册:commands([InspireCommand::class]) - 计划任务不再写在
schedule()方法里,而是调用Illuminate\Console\Commands::scheduling()静态方法 - 注意
Commands::scheduling()返回的是可链式调用的对象,末尾必须加->start()才真正启用调度器,漏掉就等于没写 - 如果你用
php artisan schedule:run测试,确保系统 crontab 已指向 Laravel 的调度入口,且APP_ENV是production或local,否则某些环境条件判断会跳过任务
最易被忽略的一点:Laravel 11 的“精简”不是删功能,而是把隐式行为全显性化。比如中间件组不存在、调度未 ->start()、AppServiceProvider 未手动注册——这些都不会报错,只会静默失效。调试时别只盯日志,先确认 bootstrap/app.php 里每条链式调用是否真执行到了。











