升级指南
高影响变化
中影响变化
- 授权认证
RegisterController
- Carbon 1.x 不再支持
- 数据库
Capsule::table
方法 - Eloquent Arrayable &
toArray
- Eloquent
BelongsTo::update
方法 - Eloquent 主键类型
- 本地化
Lang::trans
和Lang::transChoice
方法 - 本地化
Lang::getFromJson
方法 - 队列重试限制
- 重发 Email 验证路由
Input
Facade
从 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
框架中 RegisterController
的 register
或 registered
方法 , 则应确保在对应方法中调用了 parent::register
和 parent::registered
方法,因为 Illuminate\Auth\Events\Registered
事件触发和新用户登录逻辑现在被移到 registered
方法中了,如果你重写了这些方法而没有调用对应的父级方法,则用户注册处理会失败。
授权响应
影响程度: 低
Illuminate\Auth\Access\Response
类的构造函数参数已经改变。你应该更新相应的代码。 如果你没有手动构造过授权响应实例,只是在策略类中使用了 allow
和 deny
实例方法, 则不需要更新:
/**
* 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
的实例,而不是一个 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']);
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\Str
和 Illuminate\Support\Arr
类来更新这些辅助函数的所有调用。或者,你也可以在你的应用程序中添加新的 laravel/helpers
包来继续使用这些辅助函数:
composer require laravel/helpers
本地化
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
方法。
邮件
Mandrill 和 SparkPost 驱动已经被移除
影响程度: 低
mandrill
和sparkpost
邮件驱动已经被移除,如果你想继续使用这两个驱动中的任意一个,我们鼓励你选择采用一个社区支持的包来提供驱动。
通知
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 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。