Laravel 11新特性有哪些 Laravel 11如何升级 【同步】

7次阅读

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

Laravel 11新特性有哪些 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.phpwithMiddleware 闭包里——这一步必须人工核对。

  • 工具跳过所有自定义目录(如 app/Servicesapp/Actions),不会重命名也不会警告
  • 它不会检查第三方包是否兼容,比如 laravel/sanctum:^4.0 必须手动改 composer.json,否则 composer update 会卡住
  • 迁移后 routes/web.phproutes/api.php 被合并为 routes.php,但旧路由文件不会被自动删除,残留会导致 404 或重复加载

bootstrap/app.php 成了新中枢,中间件和路由注册全在这儿

以前分散在 app/Http/Kernel.phpapp/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_atupdated_at 迁移默认值变了,老表可能报错

Laravel 11 的迁移生成器默认给时间戳字段加上 ->default(now()),比如:$table->timestamp('created_at')->default(now());。这在新建表时没问题,但如果你对已有表执行 php artisan migratesqlitemysql 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-migrationsphp 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 验证失败——这种问题不会报错,只会“行为异常”,得靠真实请求链路验证。

text=ZqhQzanResources