升级指南
高影响变更
中等影响变更
从 5.8 升级到 6.0
预计升级时间:一小时
NOTE
我们尝试记录每一个可能的重大变更。由于这些变更中的一些位于框架的偏僻部分,只有一部分变更可能实际影响您的应用程序。
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 方法
影响可能性:中等
NOTE
此更改仅适用于将 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。
NOTE
您应运行 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 比较工具 轻松查看更改,并选择哪些更新对您来说是重要的。