Laravel Laravel
  • 前言

    • 发行说明
    • 升级向导
    • 贡献导引
    • API 文档
  • 入门指南

    • 安装
    • 配置
    • 文件夹结构
    • Homestead
    • Valet
    • 部署
  • 架构思想

    • 请求生命周期
    • 服务容器
    • 服务提供者
    • Facades:门面
    • Contracts:契约
  • 基础功能

    • 路由
    • 中间件
    • CSRF 保护
    • 控制器
    • 请求
    • 响应
    • 视图
    • URL 生成
    • Session
    • 表单验证
    • 错误处理
    • 日志
  • 前端开发

    • Blade 模板
    • 本地化
    • 前端脚手架
    • 编译资源
  • 安全

    • 身份认证
    • API 身份认证
    • 授权
    • 邮件验证
    • 加密
    • 哈希
    • 重置密码
  • 深入话题

    • Artisan 命令行
    • 广播
    • 缓存
    • 集合
    • 事件
    • 文件存储
    • 辅助函数
    • Mail
    • 消息通知
    • 扩展包开发
    • 队列
    • 任务调度
  • 数据库

    • 快速入门
    • 查询构造器
    • 分页
    • 数据库迁移
    • 数据填充
    • Redis
  • Eloquent ORM

    • 快速入门
    • 关联关系
    • Eloquent 集合
    • 修改器
    • API 资源
    • 序列化
  • 测试

    • 快速入门
    • HTTP 测试
    • 命令行测试
    • 浏览器测试
    • 数据库测试
    • 测试模拟器Mocking
  • 官方扩展包

    • Cashier
    • Dusk浏览器测试
    • Envoy部署工具
    • Horizon队列管理工具
    • Passport OAuth 认证
    • Scout全文搜索
    • Socialite社会化登录
    • Telescope 调试工具
Icon

提示 您正在浏览旧版本的 Laravel 的文档. 请考虑将你的项目升级到 Laravel 11.x.

23 2

升级说明
6.x
8.x 7.x 6.x 5.8 5.7 5.6 5.5 5.4 5.3 5.2 5.1

Laravel 6 中文文档 /

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

升级指南

  • 从 5.8 升级到 6.0

高影响变化

  • 授权认证资源 & viewAny
  • 字符串和数组辅助函数

中影响变化

  • 授权认证 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 轻松查看变更,以便选择那些对你而言更为重要的更新。

本文章首发在 网站上。


上一篇 下一篇

成为Laravel合作伙伴

Laravel Partners是提供一流Laravel开发和咨询服务的精英商店。我们每个合作伙伴都可以帮助您制定一个精美,结构完善的项目.

我们的伙伴
Laravel
亮点
  • Our Team
  • 发布说明
  • 入门
  • 路由
  • Blade 模板
  • 身份验证
  • 用户授权
  • Artisan 控制台
  • 数据库
  • Eloquent ORM
  • 测试
资源
  • Laravel Bootcamp
  • Laracasts
  • Laravel News
  • Laracon
  • Laracon EU
  • Laracon India
  • Jobs
  • Forums
  • Trademark
  • 版本发布时间
  • 包开发
  • 命令行应用
  • TALL stack全栈开发
  • Blade UI Kit
  • 前端资源构建
伙伴
  • WebReinvent
  • Vehikl
  • Tighten
  • 64 Robots
  • Active Logic
  • Byte 5
  • Curotec
  • Cyber-Duck
  • DevSquad
  • Jump24
  • Kirschbaum
生态系统
  • Cashier
  • Dusk
  • Echo
  • Envoyer
  • Forge
  • Horizon
  • Nova
  • Octane
  • Sail
  • Sanctum
  • Scout
  • Spark
  • Telescope
  • Valet
  • Vapor

Laravel是一个具有表达力,优雅语法的Web应用程序框架。我们认为,发展必须是一种令人愉悦的创造力,才能真正实现。Laravel试图通过减轻大多数Web项目中使用的常见任务来减轻开发的痛苦.

Laravel是Taylor Otwell的商标.
Copyright © 2011-2025 Laravel中文网 LLC.

  • Twitter
  • GitHub
  • Discord
Laravel 全栈开发网 推荐使用阿里云 按Ctrl+D试试