跳至内容

升级指南

重大影响变化

中等影响变化

低影响变化

从 11.x 升级到 12.0

预计升级时间:5 分钟

我们尽力记录所有可能的重大变更。由于有些重大变更位于框架中不太显眼的部分,因此只有其中一部分可能会真正影响您的应用程序。想要节省时间?您可以使用Laravel Shift来自动化您的应用程序升级。

更新依赖项

影响可能性:高

您应该更新应用程序composer.json文件中的以下依赖项:

  • laravel/framework^12.0
  • phpunit/phpunit^11.0
  • pestphp/pest^3.0

碳3

影响可能性:低

对Carbon 2.x 的支持已被移除。所有 Laravel 12 应用程序现在都需要Carbon 3.x

更新 Laravel 安装程序

如果您使用 Laravel 安装程序 CLI 工具创建新的 Laravel 应用程序,则应更新安装程序以使其与 Laravel 12.x 和新的 Laravel 入门套件兼容。如果您通过 安装了 Laravel 安装程序composer global require,则可以使用 更新安装程序composer global update

1composer global update laravel/installer

如果您最初通过 安装了 PHP 和 Laravel php.new,您可以简单地重新运行php.new操作系统的安装命令来安装最新版本的 PHP 和 Laravel 安装程序:

1/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
1# Run as administrator...
2Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://php.new/install/windows/8.4'))
1/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"

或者,如果您正在使用Laravel Herd捆绑的 Laravel 安装程序副本,则应将 Herd 安装更新到最新版本。

验证

更新的DatabaseTokenRepository构造函数签名

影响可能性:非常低

该类的构造函数Illuminate\Auth\Passwords\DatabaseTokenRepository现在要求$expires以秒而不是分钟为单位给出参数。

并发

并发结果索引映射

影响可能性:低

当使用关联数组调用该Concurrency::run方法时,并发操作的结果现在将与其关联的键一起返回:

1$result = Concurrency::run([
2 'task-1' => fn () => 1 + 1,
3 'task-2' => fn () => 2 + 2,
4]);
5 
6// ['task-1' => 2, 'task-2' => 4]

容器

容器类依赖关系解析

影响可能性:低

依赖注入容器现在在解析类实例时会遵循类属性的默认值。如果您之前依赖容器来解析没有默认值的类实例,则可能需要调整应用程序以适应这一新行为:

1class Example
2{
3 public function __construct(public ?Carbon $date = null) {}
4}
5 
6$example = resolve(Example::class);
7 
8// <= 11.x
9$example->date instanceof Carbon;
10 
11// >= 12.x
12$example->date === null;

数据库

多模式数据库检查

影响可能性:低

Schema::getTables()Schema::getViews()方法Schema::getTypes()现在默认包含所有架构的结果。您可以传递schema参数来仅检索给定架构的结果:

1// All tables on all schemas...
2$tables = Schema::getTables();
3 
4// All tables on the 'main' schema...
5$tables = Schema::getTables(schema: 'main');
6 
7// All tables on the 'main' and 'blog' schemas...
8$tables = Schema::getTables(schema: ['main', 'blog']);

Schema::getTableListing()方法现在默认返回符合架构的表名。您可以传递schemaQualified参数来根据需要更改行为:

1$tables = Schema::getTableListing();
2// ['main.migrations', 'main.users', 'blog.posts']
3 
4$tables = Schema::getTableListing(schema: 'main');
5// ['main.migrations', 'main.users']
6 
7$tables = Schema::getTableListing(schema: 'main', schemaQualified: false);
8// ['migrations', 'users']

命令现在输出 MySQL、MariaDB 和 SQLite 上所有模式的结果,就像 PostgreSQL 和 SQL Server 一样db:tabledb:show

更新的Blueprint构造函数签名

影响可能性:非常低

该类的构造函数Illuminate\Database\Schema\Blueprint现在期望一个实例Illuminate\Database\Connection作为其第一个参数。

雄辩

模型和 UUIDv7

影响可能性:中等

HasUuids特征现在返回与 UUID 规范版本 7 兼容的 UUID(有序 UUID)。如果您想继续使用有序 UUIDv4 字符串作为模型 ID,现在应该使用以下HasVersion4Uuids特征:

1use Illuminate\Database\Eloquent\Concerns\HasUuids;
2use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids;

HasVersion7Uuids特征已被移除。如果您之前正在使用此特征,请改用此HasUuids特征,它现在提供相同的行为。

请求

嵌套数组请求合并

影响可能性:低

$request->mergeIfMissing()方法现在允许使用“点”符号合并嵌套数组数据。如果您之前依赖此方法创建包含“点”符号版本的顶级数组键,则可能需要调整应用程序以适应此新行为:

1$request->mergeIfMissing([
2 'user.last_name' => 'Otwell',
3]);

验证

图像验证现在不包括 SVG

验证规则image默认不再允许 SVG 图像。如果您希望在使用该image规则时允许 SVG,则必须明确允许它们:

1use Illuminate\Validation\Rules\File;
2 
3'photo' => 'required|image:allow_svg'
4 
5// Or...
6'photo' => ['required', File::image(allowSvg: true)],

各种各样的

我们也鼓励您查看laravel/laravel GitHub 仓库中的更改。虽然其中许多更改并非必需,但您可能希望将这些文件与您的应用程序保持同步。本升级指南将涵盖其中一些更改,但其他更改(例如配置文件或注释的更改)则不会涵盖。您可以使用GitHub 比较工具轻松查看更改,并选择对您而言重要的更新。