升级指南
升级指南
高影响变更
中等影响变更
低影响变更
从 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' 模式的所有表...
$tables = Schema::getTables(schema: 'main');
// 'main' 和 'blog' 模式的所有表...
$tables = Schema::getTables(schema: ['main', 'blog']);
Schema::getTableListing()
方法现默认返回带模式限定的表名。可通过传递 schemaQualified
参数调整此行为:
$tables = Schema::getTableListing();
// ['main.migrations', 'main.users', 'blog.posts']
$tables = Schema::getTableListing(schema: 'main');
// ['main.migrations', 'main.users']
$tables = 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
特性现在返回与 UUID 规范第 7 版兼容的 UUID(有序 UUID)。如需继续使用 UUIDv4 字符串作为模型 ID,请改用 HasVersion4Uuids
特性:
use Illuminate\Database\Eloquent\Concerns\HasUuids; // [tl! remove]
use Illuminate\Database\Eloquent\Concerns\HasVersion4Uuids as HasUuids; // [tl! add]
HasVersion7Uuids
特性现已被移除。若你此前使用过该特性,应改用 HasUuids
特性以实现相同功能。
请求
嵌套数组请求合并
影响可能性:低
$request->mergeIfMissing()
方法现已支持通过「点」表示法合并嵌套数组数据。若此前依赖此方法生成包含「点」表示法键名的顶层数组键,可能需要针对此新特性调整应用以适应新行为:
$request->mergeIfMissing([
'user.last_name' => 'Otwell',
]);
表单验证
图像验证默认排除 SVG
image
验证规则默认不再允许 SVG 图像。若需在使用此规则时允许 SVG 文件,需显式指定:
use Illuminate\Validation\Rules\File;
'photo' => 'required|image:allow_svg'
// 或...
'photo' => ['required', File::image(allowSvg: true)],
其他变更
我们还鼓励你查看 laravel/laravel
的 GitHub 仓库中的变更。虽然许多这些变更不是必需的,你可能希望将这些文件与你的应用程序保持同步。这些变更中的一些将在此升级指南中介绍,但其他一些,如配置文件或注释的变更,则不会。你可以使用 GitHub 对比工具 查看所有变更,并选择对你而言重要的更新。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: