升级说明

未匹配的标注
本文档最新版为 10.x,旧版本可能放弃维护,推荐阅读最新版!

升级指南#

高影响变化#

中影响变化#

从 5.8 升级到 6.0#

预计升级时间:一小时#

{注意} 我们尝试记录了每个可能的主要变化。由于这些主要变化中的一些是在框架的模糊部分,因此这些变化中的某些部分可能会对应用程序产生实际影响。

需要 PHP 7.2 版本#

影响程度:中

PHP 7.1 版本从 2019 年十二月起将不再进行主动维护了。因此,Laravel 6.0 需要 PHP 7.2 或以上版本。

升级依赖#

升级 laravel/framework 依赖于 composer.json 文件中指定的 ^6.0

接下来,检查应用程序使用的任何第三方软件包,验证其是否适配 Laravel 6 支持的版本。

授权认证#

认证资源 & viewAny#

影响程度:高

使用 authorizeResource 方法附加到控制器中的授权策略现在应该要定义一个 viewAny 方法,当用户访问控制器中的 index 方法它就会被调用。换而言之,未经授权去访问控制器中的 index 方法将被拒绝。

RegisterController 控制器#

影响程度:中

如果你重写过 Laravel 框架中 RegisterControllerregisterregistered 方法 , 则应确保在对应方法中调用了 parent::registerparent::registered 方法,因为 Illuminate\Auth\Events\Registered 事件触发和新用户登录逻辑现在被移到 registered 方法中了,如果你重写了这些方法而没有调用对应的父级方法,则用户注册处理会失败。

授权响应#

影响程度:低

Illuminate\Auth\Access\Response 类的构造函数参数已经改变。你应该更新相应的代码。 如果你没有手动构造过授权响应实例,只是在策略类中使用了 allowdeny 实例方法, 则不需要更新:

/**
 * Create a new response.
 *
 * @param  bool  $allowed
 * @param  string  $message
 * @param  mixed  $code
 * @return void
 */
public function __construct($allowed, $message = '', $code = null)

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 文件中,更新这个环境变量的名称。

Database#

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 的实例,而不是一个 GeneratorLazyCollection 可以像生成器一样迭代:

$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']);

Arrayable 类 & toArray 方法#

影响程度:中

现在 Eloquent 集合的 toArray 方法实现了 Illuminate\Contracts\Support\Arrayable 类方法,将会把任何属性类型强制转换为数组。

主键类型的声明#

影响程度:中

Laravel 6.0 已经收到整数类型密钥的性能优化 建议。如果你使用字符串作为模型的主键,那么你应该在模型属性的 $keyType 上声明密钥类型:

/**
 * 主键 ID 的「类型」。
 *
 * @var string
 */
protected $keyType = 'string';

Email 验证#

重发验证路由 HTTP 方法#

影响程度:中

为了防止可能的 CSRF 攻击,当你使用 Laravel 内置 email 验证时,系统注册的路由 email/resend 请求方式已经从 GET 变更为 POST。因此,请求此路由时,需要前端代码发送正确的请求方式。例如你可以使用如下内置的 email 验证模板:

{{ __('Before proceeding, please check your email for a verification link.') }}
{{ __('If you did not receive the email') }},

<form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
    @csrf

    <button type="submit" class="btn btn-link p-0 m-0 align-baseline">
        {{ __('click here to request another') }}
    </button>.
</form>

MustVerifyEmail 契约#

影响程度:低

一个新的方法 getEmailForVerification 加入到了 Illuminate\Contracts\Auth\MustVerifyEmail 契约。如果你正在手动实现这个契约,你应该实现这个方法。这个方法应该返回对象关联的电子邮箱地址。如果你的 App\User 模型正在使用 Illuminate\Auth\MustVerifyEmail 特性,不需要更改,因为这个特性会帮你实现这个方法。

辅助函数#

String & Array 辅助函数包#

影响程度:高

所有的 str_array_ 辅助函数都已经从框架中移除,并移动到新的 laravel/helpers Composer 包中。如果需要,你可以使用 Illuminate\Support\StrIlluminate\Support\Arr 类来更新这些辅助函数的所有调用。或者,你也可以在你的应用程序中添加新的 laravel/helpers 包来继续使用这些辅助函数:

composer require laravel/helpers

本地化#

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 方法。

邮件#

Mandrill 和 SparkPost 驱动已经被移除#

影响程度:低

mandrillsparkpost 邮件驱动已经被移除,如果你想继续使用这两个驱动中的任意一个,我们鼓励你选择采用一个社区支持的包来提供驱动。

通知#

Nexmo 路由已被移除#

影响程度:低

Nexmo 通知通道的延迟部分已经被从框架的核心中移除。如果你依赖于 Nexmo 通知路由,你应该在你的通知实体中手动的实现 routeNotificationForNexmo 方法。 详细描述请看这.

重置密码#

密码验证#

影响程度:低

PasswordBroker 不再限制或者验证密码。在 ResetPasswordController 类中密码验证已经被处理过了,这使得代理的验证显得冗余并且无法自定义。如果你在内置 ResetPasswordController 类中手动使用 PasswordBroker(或者 Password 门面),你应该在把所有密码传递给代理之前进行验证。

队列#

队列重试限制#

影响程度:中

在之前的 Laravel 版本 中,php artisan queue:work 命令会无限期重试队列任务,从 Laravel 6.0 开始,该命令默认只会重试队列任务一次,如果你想要强制任务无限期重试, 可以通过 --tries=0 指定:

php artisan queue:work --tries=0

另外,请确保你的数据库中包含 failed_jobs 数据表。你可以通过 Artisan 命令 queue:failed-table 来生成这个迁移:

php artisan queue:failed-table

请求#

Input 门面#

影响程度:中

Input 门面是 Request 门面的复制品,已经被移除。如果你在使用 Input::get 方法,应该将其替换成 Request::input 方法。所有其他调用 Input 门面的地方也同样需替换为 Request 门面.

任务调度#

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']);    

其他#

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

本文章首发在 LearnKu.com 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。

原文地址:https://learnku.com/docs/laravel/6.x/upg...

译文地址:https://learnku.com/docs/laravel/6.x/upg...

上一篇 下一篇
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
贡献者:17