升级指南

高影响变化

中影响变化

从 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 实例方法, 则不需要更新:

  1. /**
  2. * Create a new response.
  3. *
  4. * @param bool $allowed
  5. * @param string $message
  6. * @param mixed $code
  7. * @return void
  8. */
  9. 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 ,则应相应地更新对此方法的任何调用

  1. /**
  2. * 获得流畅的查询构建器实例
  3. *
  4. * @param \Closure|\Illuminate\Database\Query\Builder|string $table
  5. * @param string|null $as
  6. * @param string|null $connection
  7. * @return \Illuminate\Database\Query\Builder
  8. */
  9. public static function table($table, $as = null, $connection = null)

cursor 方法

影响程度:低

cursor 方法现在返回一个 Illuminate\Support\LazyCollection 的实例,而不是一个 GeneratorLazyCollection 可以像生成器一样迭代:

  1. $users = App\User::cursor();
  2. foreach ($users as $user) {
  3. //
  4. }

Eloquent 集合

BelongsTo::update 方法

影响程度:中

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

如果你通过 BelongsTo 更新关联关系连接的模型,并获取批量赋值更新保护和事件触发,则需要在模型自身上调用 update 方法:

  1. // 临时查询…没有批量赋值保护或事件触发…
  2. $post->user()->update(['foo' => 'bar']);
  3. // 模型更新…提供批量赋值保护和事件触发…
  4. $post->user->update(['foo' => 'bar']);

Arrayable 类 & toArray 方法

影响程度:中

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

主键类型的声明

影响程度:中

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

  1. /**
  2. * 主键 ID 的「类型」。
  3. *
  4. * @var string
  5. */
  6. protected $keyType = 'string';

Email 验证

重发验证路由 HTTP 方法

影响程度:中

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

  1. {{ __('Before proceeding, please check your email for a verification link.') }}
  2. {{ __('If you did not receive the email') }},
  3. <form class="d-inline" method="POST" action="{{ route('verification.resend') }}">
  4. @csrf
  5. <button type="submit" class="btn btn-link p-0 m-0 align-baseline">
  6. {{ __('click here to request another') }}
  7. </button>.
  8. </form>

MustVerifyEmail 契约

影响程度:低

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

辅助函数

String & Array 辅助函数包

影响程度:高

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

  1. 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 指定:

  1. php artisan queue:work --tries=0

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

  1. php artisan queue:failed-table

请求

Input 门面

影响程度: 中

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

任务调度

between 方法

影响程度: 低

在 Laravel 之前的版本中, 调度器的 between 方法出现了跨越日期边界的混乱行为。 例如:

  1. $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 开始,这些值会被追加到查询字符串中,如下所示:

  1. Route::get('/profile/{location?}', function ($location = null) {
  2. //
  3. })->name('profile');
  4. // Laravel 5.8: http://example.com/profile/active
  5. echo route('profile', ['status' => 'active']);
  6. // Laravel 6.0: http://example.com/profile?status=active
  7. echo route('profile', ['status' => 'active']);

其他

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

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

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