升级指南
高影响变更
中等影响变更
从 5.8 升级到 6.0
预计升级时间:一小时
我们尝试记录每一个可能的重大变更。由于这些变更中的一些位于框架的偏僻部分,只有一部分变更可能实际影响您的应用程序。
PHP 7.2 必需
影响可能性:中等
PHP 7.1 将不再在 2019 年 12 月后得到积极维护。因此,Laravel 6.0 需要 PHP 7.2 或更高版本。
更新依赖
在您的 composer.json
文件中将 laravel/framework
依赖更新为 ^6.0
。如果已安装,请将 laravel/passport
依赖更新为 ^9.3.2
。
接下来,检查您的应用程序使用的任何第三方包,并验证您使用的是支持 Laravel 6 的正确版本。
授权
授权资源 & viewAny
影响可能性:高
使用 authorizeResource
方法附加到控制器的授权策略现在应定义一个 viewAny
方法,该方法将在用户访问控制器的 index
方法时调用。否则,对控制器的 index
方法的调用将被拒绝为未经授权。
授权响应
影响可能性:低
Illuminate\Auth\Access\Response
类的构造函数签名已更改。您应相应地更新您的代码。如果您没有手动构建授权响应,并且仅在策略中使用 allow
和 deny
实例方法,则无需更改:
/**
* 创建一个新的响应。
*
* @param bool $allowed
* @param string $message
* @param mixed $code
* @return void
*/
public function __construct($allowed, $message = '', $code = null)
返回“拒绝”响应
影响可能性:低
在 Laravel 的先前版本中,您不需要从策略方法中返回 deny
方法的值,因为异常会立即抛出。然而,根据 Laravel 文档,您现在必须从策略中返回 deny
方法的值:
public function update(User $user, Post $post)
{
if (! $user->role->isEditor()) {
return $this->deny("您必须是编辑才能编辑此帖子。")
}
return $user->id === $post->user_id;
}
Illuminate\Contracts\Auth\Access\Gate
合约
影响可能性:低
Illuminate\Contracts\Auth\Access\Gate
合约新增了一个 inspect
方法。如果您手动实现此接口,您应在实现中添加此方法。
Carbon
不再支持 Carbon 1.x
影响可能性:中等
Carbon 1.x 不再支持,因为它即将结束维护生命周期。请将您的应用程序升级到 Carbon 2.0。
配置
AWS_REGION
环境变量
影响可能性:可选
如果您计划使用 Laravel Vapor,您应将 config
目录中的所有 AWS_REGION
更新为 AWS_DEFAULT_REGION
。此外,您应在 .env
文件中更新此环境变量的名称。
Redis 默认客户端
影响可能性:中等
默认的 Redis 客户端已从 predis
更改为 phpredis
。为了继续使用 predis
,请确保在 config/database.php
配置文件中将 redis.client
配置选项设置为 predis
。
DynamoDB 缓存存储
影响可能性:可选
如果您计划使用 Laravel Vapor,您应更新 config/cache.php
文件以包含 dynamodb
存储。
<?php
return [
...
'stores' => [
...
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
...
];
SQS 环境变量
影响可能性:可选
如果您计划使用 Laravel Vapor,您应更新 config/queue.php
文件以包含更新的 sqs
连接环境变量。
<?php
return [
...
'connections' => [
...
'sqs' => [
'driver' => 'sqs',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
],
...
];
数据库
Capsule table
方法
影响可能性:中等
此更改仅适用于将 illuminate/database
作为依赖项的非 Laravel 应用程序。
Illuminate\Database\Capsule\Manager
类的 table
方法的签名已更新,以接受表别名作为第二个参数。如果您在 Laravel 应用程序之外使用 illuminate/database
,您应相应地更新对此方法的任何调用:
/**
* 获取一个流畅的查询构建器实例。
*
* @param \Closure|\Illuminate\Database\Query\Builder|string $table
* @param string|null $as
* @param string|null $connection
* @return \Illuminate\Database\Query\Builder
*/
public static function table($table, $as = null, $connection = null)
cursor
方法
影响可能性:低
cursor
方法现在返回一个 Illuminate\Support\LazyCollection
实例,而不是 Generator
。LazyCollection
可以像生成器一样迭代:
$users = App\User::cursor();
foreach ($users as $user) {
//
}
Eloquent
BelongsTo::update
方法
影响可能性:中等
为了保持一致性,BelongsTo
关系的 update
方法现在作为一个临时更新查询运行,这意味着它不提供批量赋值保护或触发 Eloquent 事件。这使得该关系与所有其他类型关系的 update
方法保持一致。
如果您希望更新通过 BelongsTo
关系附加的模型并接收批量赋值更新保护和事件,您应在模型本身上调用 update
方法:
// 临时查询...没有批量赋值保护或事件...
$post->user()->update(['foo' => 'bar']);
// 模型更新...提供批量赋值保护和事件...
$post->user->update(['foo' => 'bar']);
可数组化 & toArray
影响可能性:中等
Eloquent 模型的 toArray
方法现在将任何实现 Illuminate\Contracts\Support\Arrayable
的属性转换为数组。
主键类型声明
影响可能性:中等
Laravel 6.0 已收到 性能优化 以支持整数键类型。如果您使用字符串作为模型的主键,您应使用模型上的 $keyType
属性声明键类型:
/**
* 主键 ID 的“类型”。
*
* @var string
*/
protected $keyType = 'string';
电子邮件验证
重发验证路由 HTTP 方法
影响可能性:中等
为了防止可能的 CSRF 攻击,使用 Laravel 内置电子邮件验证时由路由器注册的 email/resend
路由已从 GET
路由更新为 POST
路由。因此,您需要更新前端以发送正确的请求类型到此路由。例如,如果您使用内置的电子邮件验证模板脚手架:
{{ __('在继续之前,请检查您的电子邮件以获取验证链接。') }}
{{ __('如果您没有收到电子邮件') }},
<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
@csrf
<button type="submit" class="btn btn-link p-0 m-0 align-baseline">
{{ __('点击这里请求另一个') }}
</button>.
</form>
MustVerifyEmail
合约
影响可能性:低
Illuminate\Contracts\Auth\MustVerifyEmail
合约新增了一个 getEmailForVerification
方法。如果您手动实现此合约,您应实现此方法。此方法应返回对象关联的电子邮件地址。如果您的 App\User
模型使用 Illuminate\Auth\MustVerifyEmail
trait,则无需更改,因为此 trait 已实现此方法。
电子邮件验证路由变更
影响可能性:中等
验证电子邮件的路由路径已从 /email/verify/{id}
更改为 /email/verify/{id}/{hash}
。在升级到 Laravel 6.x 之前发送的任何电子邮件验证邮件将不再有效,并将显示 404 页面。如果您愿意,您可以定义一个匹配旧验证 URL 路径的路由,并为用户显示一条信息,要求他们重新验证电子邮件地址。
助手
字符串 & 数组助手包
影响可能性:高
所有 str_
和 array_
助手已移至新的 laravel/helpers
Composer 包,并从框架中移除。如果需要,您可以将所有对这些助手的调用更新为使用 Illuminate\Support\Str
和 Illuminate\Support\Arr
类。或者,您可以将新的 laravel/helpers
包添加到您的应用程序中以继续使用这些助手:
composer require laravel/helpers
如果您选择更新 Laravel 应用程序的视图以使用基于类的方法,您应清除可能仍在使用全局助手的已编译视图:
php artisan view:clear
本地化
Lang::trans
& Lang::transChoice
方法
影响可能性:中等
翻译器的 Lang::trans
和 Lang::transChoice
方法已重命名为 Lang::get
和 Lang::choice
。
此外,如果您手动实现 Illuminate\Contracts\Translation\Translator
合约,您应将实现的 trans
和 transChoice
方法更新为 get
和 choice
。
Lang::getFromJson
方法
影响可能性:中等
Lang::get
和 Lang::getFromJson
方法已合并。对 Lang::getFromJson
方法的调用应更新为调用 Lang::get
。
您应运行 php artisan view:clear
Artisan 命令以避免与移除 Lang::transChoice
、Lang::trans
和 Lang::getFromJson
相关的 Blade 错误。
邮件
移除 Mandrill & SparkPost 驱动
影响可能性:低
mandrill
和 sparkpost
邮件驱动已被移除。如果您希望继续使用这些驱动,我们建议您采用您选择的社区维护包来提供驱动。
通知
移除 Nexmo 路由
影响可能性:低
Nexmo 通知通道的一个遗留部分已从框架核心中移除。如果您依赖于路由 Nexmo 通知,您应手动在可通知实体上实现 routeNotificationForNexmo
方法 如文档中所述。
密码重置
密码验证
影响可能性:低
PasswordBroker
不再限制或验证密码。密码验证已经由 ResetPasswordController
类处理,使得 broker 的验证冗余且无法自定义。如果您在内置的 ResetPasswordController
之外手动使用 PasswordBroker
(或 Password
facade),您应在将密码传递给 broker 之前验证所有密码。
队列
队列重试限制
影响可能性:中等
在 Laravel 的先前版本中,php artisan queue:work
命令会无限重试作业。从 Laravel 6.0 开始,此命令现在默认尝试一次作业。如果您希望强制作业无限次尝试,您可以将 0
传递给 --tries
选项:
php artisan queue:work --tries=0
此外,请确保您的应用程序数据库包含一个 failed_jobs
表。您可以使用 queue:failed-table
Artisan 命令生成此表的迁移:
php artisan queue:failed-table
请求
Input
Facade
影响可能性:中等
Input
facade,主要是 Request
facade 的重复,已被移除。如果您使用 Input::get
方法,您现在应调用 Request::input
方法。所有其他对 Input
facade 的调用可以简单地更新为使用 Request
facade。
调度
between
方法
影响可能性:低
在 Laravel 的先前版本中,调度器的 between
方法在日期边界上表现出令人困惑的行为。例如:
$schedule->command('list')->between('23:00', '4:00');
对于大多数用户来说,此方法的预期行为是在 23:00 到 4:00 之间的所有分钟内每分钟运行一次 list
命令。然而,在 Laravel 的先前版本中,调度器在 4:00 到 23:00 之间的每分钟运行 list
命令,基本上交换了时间阈值。在 Laravel 6.0 中,此行为已得到纠正。
存储
移除 Rackspace 存储驱动
影响可能性:低
rackspace
存储驱动已被移除。如果您希望继续使用 Rackspace 作为存储提供商,我们建议您采用您选择的社区维护包来提供此驱动。
URL 生成
路由 URL 生成 & 额外参数
在 Laravel 的先前版本中,将关联数组参数传递给 route
助手或 URL::route
方法有时会在为路由生成 URL 时将这些参数用作 URI 值,即使参数值在路由路径中没有匹配的键。从 Laravel 6.0 开始,这些值将附加到查询字符串中。例如,考虑以下路由:
Route::get('/profile/{location?}', function ($location = null) {
//
})->name('profile');
// Laravel 5.8: http://example.com/profile/active
echo route('profile', ['status' => 'active']);
// Laravel 6.0: http://example.com/profile?status=active
echo route('profile', ['status' => 'active']);
action
助手和 URL::action
方法也受此更改影响:
Route::get('/profile/{id?}', 'ProfileController@show');
// Laravel 5.8: http://example.com/profile/1
echo action('ProfileController@show', ['profile' => 1]);
// Laravel 6.0: http://example.com/profile?profile=1
echo action('ProfileController@show', ['profile' => 1]);
验证
FormRequest validationData
方法
影响可能性:低
表单请求的 validationData
方法从 protected
更改为 public
。如果您在实现中重写此方法,您应将可见性更新为 public
。
杂项
我们还鼓励您查看 laravel/laravel
GitHub 仓库 中的更改。虽然这些更改中有许多不是必需的,但您可能希望将这些文件与您的应用程序保持同步。这些更改中的一些将在本升级指南中介绍,但其他更改,例如配置文件或注释的更改,将不会介绍。您可以使用 GitHub 比较工具 轻松查看更改,并选择哪些更新对您来说是重要的。