升级说明

未匹配的标注
本文档最新版为 8.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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
上一篇 下一篇
Summer
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
贡献者:17
讨论数量: 3
发起讨论 只看当前版本


wade
Laravel 升级报错
0 个点赞 | 3 个回复 | 问答 | 课程版本 6.x
laravel_denghy
项目升级 Laravel 5.8 到 6.0 的疑问
0 个点赞 | 3 个回复 | 分享 | 课程版本 6.0