Skip to content

升级指南

高影响变更

中等影响变更

从 5.8 升级到 6.0

预计升级时间:一小时

exclamation

我们尝试记录每一个可能的重大变更。由于这些变更中的一些位于框架的偏僻部分,只有一部分变更可能实际影响您的应用程序。

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 类的构造函数签名已更改。您应相应地更新您的代码。如果您没有手动构建授权响应,并且仅在策略中使用 allowdeny 实例方法,则无需更改:

php
/**
 * 创建一个新的响应。
 *
 * @param  bool  $allowed
 * @param  string  $message
 * @param  mixed  $code
 * @return void
 */
public function __construct($allowed, $message = '', $code = null)

返回“拒绝”响应

影响可能性:低

在 Laravel 的先前版本中,您不需要从策略方法中返回 deny 方法的值,因为异常会立即抛出。然而,根据 Laravel 文档,您现在必须从策略中返回 deny 方法的值:

php
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
<?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
<?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 方法

影响可能性:中等

exclamation

此更改仅适用于将 illuminate/database 作为依赖项的非 Laravel 应用程序。

Illuminate\Database\Capsule\Manager 类的 table 方法的签名已更新,以接受表别名作为第二个参数。如果您在 Laravel 应用程序之外使用 illuminate/database,您应相应地更新对此方法的任何调用:

php
/**
 * 获取一个流畅的查询构建器实例。
 *
 * @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 实例,而不是 GeneratorLazyCollection 可以像生成器一样迭代:

php
$users = App\User::cursor();

foreach ($users as $user) {
    //
}

Eloquent

BelongsTo::update 方法

影响可能性:中等

为了保持一致性,BelongsTo 关系的 update 方法现在作为一个临时更新查询运行,这意味着它不提供批量赋值保护或触发 Eloquent 事件。这使得该关系与所有其他类型关系的 update 方法保持一致。

如果您希望更新通过 BelongsTo 关系附加的模型并接收批量赋值更新保护和事件,您应在模型本身上调用 update 方法:

php
// 临时查询...没有批量赋值保护或事件...
$post->user()->update(['foo' => 'bar']);

// 模型更新...提供批量赋值保护和事件...
$post->user->update(['foo' => 'bar']);

可数组化 & toArray

影响可能性:中等

Eloquent 模型的 toArray 方法现在将任何实现 Illuminate\Contracts\Support\Arrayable 的属性转换为数组。

主键类型声明

影响可能性:中等

Laravel 6.0 已收到 性能优化 以支持整数键类型。如果您使用字符串作为模型的主键,您应使用模型上的 $keyType 属性声明键类型:

php
/**
 * 主键 ID 的“类型”。
 *
 * @var string
 */
protected $keyType = 'string';

电子邮件验证

重发验证路由 HTTP 方法

影响可能性:中等

为了防止可能的 CSRF 攻击,使用 Laravel 内置电子邮件验证时由路由器注册的 email/resend 路由已从 GET 路由更新为 POST 路由。因此,您需要更新前端以发送正确的请求类型到此路由。例如,如果您使用内置的电子邮件验证模板脚手架:

php
{{ __('在继续之前,请检查您的电子邮件以获取验证链接。') }}
{{ __('如果您没有收到电子邮件') }},

<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\StrIlluminate\Support\Arr 类。或者,您可以将新的 laravel/helpers 包添加到您的应用程序中以继续使用这些助手:

php
composer require laravel/helpers

如果您选择更新 Laravel 应用程序的视图以使用基于类的方法,您应清除可能仍在使用全局助手的已编译视图:

php
php artisan view:clear

本地化

Lang::trans & Lang::transChoice 方法

影响可能性:中等

翻译器的 Lang::transLang::transChoice 方法已重命名为 Lang::getLang::choice

此外,如果您手动实现 Illuminate\Contracts\Translation\Translator 合约,您应将实现的 transtransChoice 方法更新为 getchoice

Lang::getFromJson 方法

影响可能性:中等

Lang::getLang::getFromJson 方法已合并。对 Lang::getFromJson 方法的调用应更新为调用 Lang::get

exclamation

您应运行 php artisan view:clear Artisan 命令以避免与移除 Lang::transChoiceLang::transLang::getFromJson 相关的 Blade 错误。

邮件

移除 Mandrill & SparkPost 驱动

影响可能性:低

mandrillsparkpost 邮件驱动已被移除。如果您希望继续使用这些驱动,我们建议您采用您选择的社区维护包来提供驱动。

通知

移除 Nexmo 路由

影响可能性:低

Nexmo 通知通道的一个遗留部分已从框架核心中移除。如果您依赖于路由 Nexmo 通知,您应手动在可通知实体上实现 routeNotificationForNexmo 方法 如文档中所述

密码重置

密码验证

影响可能性:低

PasswordBroker 不再限制或验证密码。密码验证已经由 ResetPasswordController 类处理,使得 broker 的验证冗余且无法自定义。如果您在内置的 ResetPasswordController 之外手动使用 PasswordBroker(或 Password facade),您应在将密码传递给 broker 之前验证所有密码。

队列

队列重试限制

影响可能性:中等

在 Laravel 的先前版本中,php artisan queue:work 命令会无限重试作业。从 Laravel 6.0 开始,此命令现在默认尝试一次作业。如果您希望强制作业无限次尝试,您可以将 0 传递给 --tries 选项:

php
php artisan queue:work --tries=0

此外,请确保您的应用程序数据库包含一个 failed_jobs 表。您可以使用 queue:failed-table Artisan 命令生成此表的迁移:

php
php artisan queue:failed-table

请求

Input Facade

影响可能性:中等

Input facade,主要是 Request facade 的重复,已被移除。如果您使用 Input::get 方法,您现在应调用 Request::input 方法。所有其他对 Input facade 的调用可以简单地更新为使用 Request facade。

调度

between 方法

影响可能性:低

在 Laravel 的先前版本中,调度器的 between 方法在日期边界上表现出令人困惑的行为。例如:

php
$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 开始,这些值将附加到查询字符串中。例如,考虑以下路由:

php
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 方法也受此更改影响:

php
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 比较工具 轻松查看更改,并选择哪些更新对您来说是重要的。