laravel 11 以“减包袱”为核心,删除默认目录与配置,将控制权交还开发者;升级需人工适配中间件、路由、迁移及第三方包,非一键可完成。

Laravel 11 不是“加功能”,而是“减包袱”——它删掉了大量默认目录和配置,把控制权交还给开发者。升级不是必须的,但如果你用的是 Laravel 10 且环境已满足 PHP 8.2+,现在升是最稳妥的窗口期。
为什么 php artisan upgrade 不能一键搞定
官方提供的 laravel-upgrade 工具(运行 php artisan upgrade)能自动迁移文件结构、重命名类、更新部分配置,但它不处理业务逻辑适配。比如你项目里手动注册了中间件到 app/Http/Kernel.php,这个文件在 11.x 中已被移除,工具会删掉它,但不会帮你把中间件逻辑挪到 bootstrap/app.php 的 withMiddleware 闭包里——这一步必须人工核对。
- 工具跳过所有自定义目录(如
app/Services、app/Actions),不会重命名也不会警告 - 它不会检查第三方包是否兼容,比如
laravel/sanctum:^4.0必须手动改composer.json,否则composer update会卡住 - 迁移后
routes/web.php和routes/api.php被合并为routes.php,但旧路由文件不会被自动删除,残留会导致 404 或重复加载
bootstrap/app.php 成了新中枢,中间件和路由注册全在这儿
以前分散在 app/Http/Kernel.php、app/Providers/RouteServiceProvider.php 的逻辑,现在统一收口到 bootstrap/app.php。这不是“更简单”,而是“更显式”——你一眼就能看到整个应用的启动链路,但也意味着任何中间件顺序错乱、路由组嵌套错误,都会立刻报错,不再有“默默失效”的缓冲。
- 中间件注册示例:
->withMiddleware(function (Middleware $middleware) { $middleware->web(append: [EnsureEmailIsVerified::class]); }) - 路由加载改用
->withRouting(),默认只加载routes.php;若仍需分文件,得手动require并调用Route::middleware('web')->group(...) - 别漏掉
->withExceptions()和->withProviders(),否则异常渲染或服务提供者可能不生效
created_at 和 updated_at 迁移默认值变了,老表可能报错
Laravel 11 的迁移生成器默认给时间戳字段加上 ->default(now()),比如:$table->timestamp('created_at')->default(now());。这在新建表时没问题,但如果你对已有表执行 php artisan migrate,SQLite 或 MySQL 5.7 以下会直接报错:“Invalid default value for 'created_at'”。
- MySQL 用户要确认版本 ≥ 5.7,或开启
sql_mode=ALLOW_INVALID_DATES(不推荐) - SQLite 用户需确保最低版本 ≥ 3.32.0,否则迁移失败
- 已有项目升级时,建议先在迁移中显式写
->useCurrent()或->nullable(),避免强依赖 now()
第三方包迁移命令必须手动补全
Laravel 11 不再自动加载 Sanctum、Passport、Telescope 等包的迁移文件。你运行 php artisan migrate 后,用户表没加 two_factor_secret 字段、API token 表缺失,都是因为没执行对应 vendor:publish 命令。
- 必须逐个运行:
php artisan vendor:publish --tag=sanctum-migrations、php artisan vendor:publish --tag=passport-migrations等 - 这些命令不会覆盖已有迁移,所以如果之前发布过,得先删掉旧的
database/migrations/*_create_*_tables.php再重发 - Jetstream 用户注意:
laravel/jetstream:^5.0要求同时升级laravel/fortify:^1.20,否则Fortify::authenticateUsing会找不到方法
最易被忽略的点:升级后 php artisan test 可能通过,但某些中间件在 bootstrap/app.php 里注册顺序不对,导致登录态丢失或 CSRF 验证失败——这种问题不会报错,只会“行为异常”,得靠真实请求链路验证。










