升级指南


声明:本指南适用于从 Laravel 7.x 升级到 Laravel 8.0。

影响较大

  • 模型工厂
  • 队列 retryAfter 方法
  • 队列 timeoutAt 属性
  • 默认分页

中等影响

  • 依赖 PHP 7.3.0+ 版本
  • 失败任务表批处理支持
  • 维护模式更新
  • assertExactJson 方法

升级清单

预计耗时:15分钟

PHP 7.3.0

Laravel 8 要求 PHP 版本至少是 7.3.0。

升级依赖

在项目根目录下的 composer.json 文件中更新以下依赖版本号:

  • "laravel/framework": "^8.0"
  • "nunomaduro/collision": "^5.0"
  • "guzzlehttp/guzzle": "^7.0.1"
  • "facade/ignition": "^2.3.6"

以下官方提供的扩展包已经将主版本升级为支持 Laravel 8,如果对应扩展包有升级指南的话,请在升级前先阅读相应的升级指南(点击链接即可阅读):

此外,Laravel 安装器也已经被更新为支持 composer create-project 和 Laravel Jetstream。版本号小于 4.0 的安装器会在 2020 年 10 月以后停止服务。你需要尽快将全局安装器升级到 ^4.0 版本。

最后,检查项目依赖的其他第三方扩展包,并确保使用的版本支持 Laravel 8。

集合

isset 方法

为了和典型的 PHP 行为保持一致,Illuminate\Support\CollectionoffsetExists 方法现在被更新为使用 isset 方法来替代 array_key_exists。这可能会改变处理集合项包含空值的行为:

$collection = collect([null]);

// Laravel 7.x - true
isset($collection[0]);

// Laravel 8.x - false
isset($collection[0]);

Eloquent

模型工厂

Laravel 的模型工厂特性在 8.0 版本中被完全重构为基于类进行管理,因此不再兼容 Laravel 7.x 风格的模型工厂。不过,为了简化升级流程,官方提供了一个 laravel/legacy-factories 包让你可以继续在 Laravel 8.x 中使用之前的模型工厂。你可以使用 Composer 安装这个扩展包:

composer require laravel/legacy-factories

Castable 接口

Castable 接口的 castUsing 方法现在被更新为接收数组参数,如果你实现了这个接口,需要更新相应的实现:

public static function castUsing(array $arguments);

自增/自减事件

现在在 Eloquent 模型实例上执行 incrementdecrement 方法,相关的更新和保存模型事件会被触发。

事件

Dispatcher 接口

Illuminate\Contracts\Events\Dispatcher 接口的 listen 方法被更新为调用可选的 $listener 属性,这个调整是为了支持通过反射对待处理事件类型进行自动判定。如果你手动实现了这个接口,需要更新相应的实现代码:

public function listen($events, $listener = null);

框架

维护模式更新

Laravel 的维护模式功能在 Laravel 8.x 中进行了优化,现在支持预渲染维护模式视图,从而消除终端用户在维护模式时访问出错的几率。不过,为了支持这个功能,必须在 public/index.php 文件中添加如下代码(这些代码需要紧挨着 LARAVEL_START 常量定义之后):

define('LARAVEL_START', microtime(true));

if (file_exists(__DIR__.'/../storage/framework/maintenance.php')) {
    require __DIR__.'/../storage/framework/maintenance.php';
}

php artisan down --message 选项

php artisan down 命令的 message 选项已经被移除,作为替代方案,可以参考预渲染维护模式视图中提供的消息选项。

Manager 的 $app 属性

Illuminate\Support\Manager 类中之前已经废弃的 $app 属性现在被移除了,如果你还在使用这个属性,需要使用 $container 属性替代。

elixir 辅助函数

之前已经废弃的 elixir 辅助函数现在被移除了,仍然使用这个方法的代码推荐使用 Laravel Mix 来替代。

邮件

sendNow 方法

之前已经废弃的 sendNow 方法现在被移除了,对应的替代函数是 send

分页

默认分页

分页器现在默认使用 Tailwind CSS 框架 实现样式代码,如果想要继续使用 Bootstrap,需要添加如下方法调用到 AppServiceProviderboot 方法:

use Illuminate\Pagination\Paginator;

Paginator::useBootstrap();

队列

retryAfter 方法

为了和 Laravel 其它特性保持一致,队列任务、邮件、通知和事件监听器的 retryAfter 方法和 retryAfter 属性都被重命名为 backoff。你需要更新应用中相关类的对应方法名和属性名。

timeoutAt 属性

队列任务、通知和事件监听器的 timeoutAt 属性被重命名为 retryUntil,你需要更新应用中相关类的这个属性名。

失败任务表批处理支持

如果你计划使用 Laravel 8.x 的任务批处理功能,需要调整 failed_jobs 数据表结构,首先,需要新增 uuid 字段:

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('failed_jobs', function (Blueprint $table) {
    $table->string('uuid')->after('id')->unique();
});

然后,queue 配置文件中的 failed.driver 配置项也要被更新为 database-uuids

任务调度

cron-expression

Laravel 依赖的 dragonmantank/cron-expression 版本号已经从 2.x 升级为 3.x。这不会对应用代码造成重大影响,除非你直接使用了 cron-expression 库,如果你确实这样使用了,请参考它的更新日志进行代码调整。

会话

Session 契约

Illuminate\Contracts\Session\Session 契约新增了一个 pull 方法,如果你实现了这个契约,需要更新对应的实现代码:

/**
 * Get the value of a given key and then forget it.
 *
 * @param  string  $key
 * @param  mixed  $default
 * @return mixed
 */
public function pull($key, $default = null);

测试

assertExactJson 方法

assertExactJson 方法现在要求比较数组的数字键来匹配和确保排序相同,如果你想要在不要求数字键排序一致的情况下比较 JSON 值,可以使用 assertSimilarJson 进行替代。

验证

数据库连接规则

uniqueexists 规则现在进行查询时需要指定 Eloquent 模型类的数据库连接名(通过模型类的 getConnectionName 方法访问)。

其它

我们还建议你查看 laravel/laravel Github 仓库的更新日志。尽管其中的很多更新不是必须的,但是你可以将应用中的这些文件与代码仓库保持同步。其中的一些更新已经在这篇升级指南中覆盖到了,但是还有很多其他的小更新比如配置文件或注释的微调,就不会一一指出。你可以通过 GitHub 比较工具轻松查看变更以便选择那些对你而言更为重要的更新。


点赞 取消点赞 收藏 取消收藏

<< 上一篇: 新版特性

>> 下一篇: 贡献指南