升级指南
声明:本指南适用于从 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\Collection
的 offsetExists
方法现在被更新为使用 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 模型实例上执行 increment
或 decrement
方法,相关的更新和保存模型事件会被触发。
事件
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,需要添加如下方法调用到 AppServiceProvider
的 boot
方法:
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
进行替代。
验证
数据库连接规则
unique
和 exists
规则现在进行查询时需要指定 Eloquent 模型类的数据库连接名(通过模型类的 getConnectionName
方法访问)。
其它
我们还建议你查看 laravel/laravel
Github 仓库的更新日志。尽管其中的很多更新不是必须的,但是你可以将应用中的这些文件与代码仓库保持同步。其中的一些更新已经在这篇升级指南中覆盖到了,但是还有很多其他的小更新比如配置文件或注释的微调,就不会一一指出。你可以通过 GitHub 比较工具轻松查看变更以便选择那些对你而言更为重要的更新。
无评论