升级指南
高影响变更
中等影响变更
低影响变更
从 11.x 升级到 12.0
预计升级时间:5 分钟
NOTE
我们尝试记录每一个可能的重大变更。由于这些变更中的一些位于框架的偏僻部分,只有一部分变更可能实际影响您的应用程序。想节省时间吗?您可以使用 Laravel Shift 来帮助自动化您的应用程序升级。
更新依赖项
影响可能性:高
您应该在应用程序的 composer.json
文件中更新以下依赖项:
laravel/framework
到^12.0
phpunit/phpunit
到^11.0
pestphp/pest
到^3.0
Carbon 3
影响可能性:低
对 Carbon 2.x 的支持已被移除。所有 Laravel 12 应用程序现在需要 Carbon 3.x。
更新 Laravel 安装程序
如果您使用 Laravel 安装程序 CLI 工具来创建新的 Laravel 应用程序,您应该更新您的安装程序以兼容 Laravel 12.x 和 新的 Laravel 启动套件。如果您通过 composer global require
安装了 Laravel 安装程序,您可以使用 composer global update
更新安装程序:
composer global update laravel/installer
如果您最初通过 php.new
安装了 PHP 和 Laravel,您可以简单地重新运行适用于您的操作系统的 php.new
安装命令,以安装最新版本的 PHP 和 Laravel 安装程序:
/bin/bash -c "$(curl -fsSL https://php.new/install/mac/8.4)"
# 以管理员身份运行...
Set-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'))
/bin/bash -c "$(curl -fsSL https://php.new/install/linux/8.4)"
或者,如果您使用 Laravel Herd's 捆绑的 Laravel 安装程序副本,您应该将您的 Herd 安装更新到最新版本。
认证
更新后的 DatabaseTokenRepository
构造函数签名
影响可能性:极低
Illuminate\Auth\Passwords\DatabaseTokenRepository
类的构造函数现在要求 $expires
参数以秒为单位传递,而不是以分钟为单位。
并发
并发结果索引映射
影响可能性:低
当使用关联数组调用 Concurrency::run
方法时,并发操作的结果现在会返回其关联的键:
$result = Concurrency::run([
'task-1' => fn () => 1 + 1,
'task-2' => fn () => 2 + 2,
]);
// ['task-1' => 2, 'task-2' => 4]
容器
容器类依赖解析
影响可能性:低
依赖注入容器现在在解析类实例时尊重类属性的默认值。如果您之前依赖容器在没有默认值的情况下解析类实例,您可能需要调整您的应用程序以适应这种新行为:
class Example
{
public function __construct(public ?Carbon $date = null) {}
}
$example = resolve(Example::class);
// <= 11.x
$example->date instanceof Carbon;
// >= 12.x
$example->date === null;
数据库
多模式数据库检查
影响可能性:低
Schema::getTables()
、Schema::getViews()
和 Schema::getTypes()
方法现在默认包含所有模式的结果。您可以传递 schema
参数以仅检索给定模式的结果:
// 所有模式上的所有表...
$tables = Schema::getTables();
// 'main' 模式上的所有表...
$table = Schema::getTables(schema: 'main');
// 'main' 和 'blog' 模式上的所有表...
$table = Schema::getTables(schema: ['main', 'blog']);
Schema::getTableListing()
方法现在默认返回模式限定的表名。您可以传递 schemaQualified
参数以根据需要更改行为:
$tables = Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']
$table = Schema::getTableListing(schema: 'main');
// ['main.migrations', 'main.users']
$table = Schema::getTableListing(schema: 'main', schemaQualified: false);
// ['migrations', 'users']
db:table
和 db:show
命令现在在 MySQL、MariaDB 和 SQLite 上输出所有模式的结果,就像 PostgreSQL 和 SQL Server 一样。
更新后的 Blueprint
构造函数签名
影响可能性:非常低
Illuminate\Database\Schema\Blueprint
类的构造函数现在期望其第一个参数为 Illuminate\Database\Connection
的实例。
Eloquent
模型和 UUIDv7
影响可能性:中等
HasUuids
trait 现在返回与 UUID 规范版本 7 兼容的 UUID(有序 UUID)。如果您希望继续为模型的 ID 使用有序的 UUIDv4 字符串,您现在应该使用 HasVersion4Uuids
trait:
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids;
HasVersion7Uuids
trait 已被移除。如果您之前使用此 trait,您应该使用 HasUuids
trait,它现在提供相同的行为。
请求
嵌套数组请求合并
影响可能性:低
$request->mergeIfMissing()
方法现在允许使用“点”符号合并嵌套数组数据。如果您之前依赖此方法创建包含“点”符号版本键的顶级数组键,您可能需要调整您的应用程序以适应这种新行为:
$request->mergeIfMissing([
'user.last_name' => 'Otwell',
]);
验证
图像验证现在排除 SVG
image
验证规则默认不再允许 SVG 图像。如果您希望在使用 image
规则时允许 SVG,您必须明确允许它们:
use Illuminate\Validation\Rules\File;
'photo' => 'required|image:allow_svg'
// 或者...
'photo' => ['required', File::image(allowSvg: true)],
杂项
我们还鼓励您查看 laravel/laravel
GitHub 仓库 中的更改。虽然这些更改中的许多不是必需的,但您可能希望将这些文件与您的应用程序保持同步。这些更改中的一些将在本升级指南中介绍,但其他更改,例如配置文件或注释的更改,将不会介绍。您可以轻松地使用 GitHub 比较工具 查看更改,并选择哪些更新对您重要。