升级指南
重大影响变化
中等影响变化
低影响变化
从 11.x 升级到 12.0
预计升级时间:5 分钟
我们尽力记录所有可能的重大变更。由于有些重大变更位于框架中不太显眼的部分,因此只有其中一部分可能会真正影响您的应用程序。想要节省时间?您可以使用Laravel Shift来自动化您的应用程序升级。
更新依赖项
影响可能性:高
您应该更新应用程序composer.json文件中的以下依赖项:
laravel/framework到^12.0phpunit/phpunit到^11.0pestphp/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.x12$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:table。db: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 比较工具轻松查看更改,并选择对您而言重要的更新。