发布说明
版本方案
Laravel 的版本方案遵循以下惯例:paradigm.major.minor
。主要框架版本每六个月发布一次(2 月和 8 月),而次要版本可能每周发布一次。次要版本绝不应包含破坏性更改。
当从您的应用程序或包中引用 Laravel 框架或其组件时,您应始终使用诸如 5.8.*
之类的版本约束,因为 Laravel 的主要版本确实包含破坏性更改。然而,我们始终努力确保您可以在一天或更短的时间内更新到新的主要版本。
范式转换版本相隔多年,代表框架架构和惯例的根本性转变。目前,没有正在开发的范式转换版本。
支持政策
对于 LTS 版本,例如 Laravel 5.5,提供 2 年的错误修复和 3 年的安全修复。这些版本提供最长的支持和维护窗口。对于一般版本,提供 6 个月的错误修复和 1 年的安全修复。对于所有其他库,包括 Lumen,只有最新版本会收到错误修复。
版本 | 发布 | 错误修复截止日期 | 安全修复截止日期 |
---|---|---|---|
5.0 | 2015 年 2 月 4 日 | 2015 年 8 月 4 日 | 2016 年 2 月 4 日 |
5.1 (LTS) | 2015 年 6 月 9 日 | 2017 年 6 月 9 日 | 2018 年 6 月 9 日 |
5.2 | 2015 年 12 月 21 日 | 2016 年 6 月 21 日 | 2016 年 12 月 21 日 |
5.3 | 2016 年 8 月 23 日 | 2017 年 2 月 23 日 | 2017 年 8 月 23 日 |
5.4 | 2017 年 1 月 24 日 | 2017 年 7 月 24 日 | 2018 年 1 月 24 日 |
5.5 (LTS) | 2017 年 8 月 30 日 | 2019 年 8 月 30 日 | 2020 年 8 月 30 日 |
5.6 | 2018 年 2 月 7 日 | 2018 年 8 月 7 日 | 2019 年 2 月 7 日 |
5.7 | 2018 年 9 月 4 日 | 2019 年 3 月 4 日 | 2019 年 9 月 4 日 |
5.8 | 2019 年 2 月 26 日 | 2019 年 8 月 26 日 | 2020 年 2 月 26 日 |
Laravel 5.8
Laravel 5.8 继续改进 Laravel 5.7,通过引入 has-one-through Eloquent 关系、改进的电子邮件验证、基于约定的授权策略自动注册、DynamoDB 缓存和会话驱动程序、改进的调度程序时区配置、支持为广播频道分配多个身份验证守卫、PSR-16 缓存驱动程序合规性、对 artisan serve
命令的改进、PHPUnit 8.0 支持、Carbon 2.0 支持、Pheanstalk 4.0 支持以及各种其他错误修复和可用性改进。
Eloquent HasOneThrough
关系
Eloquent 现在支持 hasOneThrough
关系类型。例如,假设一个 Supplier 模型 hasOne
Account 模型,而 Account 模型有一个 AccountHistory 模型。您可以使用 hasOneThrough
关系通过账户模型访问供应商的账户历史:
/**
* 获取供应商的账户历史。
*/
public function accountHistory()
{
return $this->hasOneThrough(AccountHistory::class, Account::class);
}
模型策略的自动发现
在使用 Laravel 5.7 时,每个模型的对应授权策略需要在应用程序的 AuthServiceProvider
中显式注册:
/**
* 应用程序的策略映射。
*
* @var array
*/
protected $policies = [
'App\User' => 'App\Policies\UserPolicy',
];
Laravel 5.8 引入了模型策略的自动发现,只要模型和策略遵循标准的 Laravel 命名约定。具体来说,策略必须位于包含模型的目录下的 Policies
目录中。因此,例如,模型可以放在 app
目录中,而策略可以放在 app/Policies
目录中。此外,策略名称必须与模型名称匹配并具有 Policy
后缀。因此,User
模型将对应于 UserPolicy
类。
如果您想提供自己的策略发现逻辑,可以使用 Gate::guessPolicyNamesUsing
方法注册自定义回调。通常,此方法应从应用程序的 AuthServiceProvider
中调用:
use Illuminate\Support\Facades\Gate;
Gate::guessPolicyNamesUsing(function ($modelClass) {
// 返回策略类名...
});
在您的 AuthServiceProvider
中显式映射的任何策略将优先于任何可能自动发现的策略。
PSR-16 缓存合规性
为了在存储项目时允许更细粒度的过期时间并提供对 PSR-16 缓存标准的合规性,缓存项目的生存时间已从分钟更改为秒。Illuminate\Cache\Repository
类及其扩展类的 put
、putMany
、add
、remember
和 setDefaultCacheTime
方法,以及每个缓存存储的 put
方法都已更新为此更改的行为。有关更多信息,请参阅相关 PR。
如果您将整数传递给这些方法中的任何一个,您应更新代码以确保现在传递的是项目在缓存中保留的秒数。或者,您可以传递一个 DateTime
实例,指示项目何时过期:
// Laravel 5.7 - 将项目存储 30 分钟...
Cache::put('foo', 'bar', 30);
// Laravel 5.8 - 将项目存储 30 秒...
Cache::put('foo', 'bar', 30);
// Laravel 5.7 / 5.8 - 将项目存储 30 秒...
Cache::put('foo', 'bar', now()->addSeconds(30));
多个广播身份验证守卫
在 Laravel 的先前版本中,私有和存在广播频道通过应用程序的默认身份验证守卫对用户进行身份验证。从 Laravel 5.8 开始,您现在可以分配多个守卫来验证传入请求:
Broadcast::channel('channel', function() {
// ...
}, ['guards' => ['web', 'admin']])
令牌守卫令牌哈希
Laravel 的 token
守卫提供基本的 API 身份验证,现在支持将 API 令牌存储为 SHA-256 哈希。这比存储明文令牌提供了更好的安全性。要了解有关哈希令牌的更多信息,请查看完整的 API 身份验证文档。
虽然 Laravel 附带一个简单的基于令牌的身份验证守卫,但我们强烈建议您考虑使用 Laravel Passport 来为提供 API 身份验证的生产应用程序提供强大的支持。
改进的电子邮件验证
Laravel 5.8 通过采用 SwiftMailer 使用的 egulias/email-validator
包改进了验证器的底层电子邮件验证逻辑。Laravel 之前的电子邮件验证逻辑偶尔会将有效的电子邮件(例如 example@bär.se
)视为无效。
默认调度程序时区
Laravel 允许您使用 timezone
方法自定义计划任务的时区:
$schedule->command('inspire')
->hourly()
->timezone('America/Chicago');
然而,如果您为所有计划任务指定相同的时区,这可能会变得繁琐且重复。因此,您现在可以在 app/Console/Kernel.php
文件中定义一个 scheduleTimezone
方法。此方法应返回应分配给所有计划任务的默认时区:
/**
* 获取应默认用于计划事件的时区。
*
* @return \DateTimeZone|string|null
*/
protected function scheduleTimezone()
{
return 'America/Chicago';
}
中间表 / 枢纽模型事件
在 Laravel 的先前版本中,附加、分离或同步多对多关系的自定义中间表 / "枢纽" 模型时不会调度 Eloquent 模型事件。在 Laravel 5.8 中使用 自定义中间表模型 时,将调度适用的模型事件。
Artisan 调用改进
Laravel 允许您通过 Artisan::call
方法调用 Artisan。在 Laravel 的先前版本中,命令的选项通过数组作为方法的第二个参数传递:
use Illuminate\Support\Facades\Artisan;
Artisan::call('migrate:install', ['database' => 'foo']);
然而,Laravel 5.8 允许您将整个命令(包括选项)作为方法的第一个字符串参数传递:
Artisan::call('migrate:install --database=foo');
Mock / Spy 测试辅助方法
为了使对象模拟更方便,新的 mock
和 spy
方法已添加到基本 Laravel 测试用例类中。这些方法会自动将模拟类绑定到容器中。例如:
// Laravel 5.7
$this->instance(Service::class, Mockery::mock(Service::class, function ($mock) {
$mock->shouldReceive('process')->once();
}));
// Laravel 5.8
$this->mock(Service::class, function ($mock) {
$mock->shouldReceive('process')->once();
});
Eloquent 资源键保留
从路由返回 Eloquent 资源集合 时,Laravel 会重置集合的键,使其按简单的数字顺序排列:
use App\User;
use App\Http\Resources\User as UserResource;
Route::get('/user', function () {
return UserResource::collection(User::all());
});
在使用 Laravel 5.8 时,您现在可以在资源类中添加一个 preserveKeys
属性,指示是否应保留集合键。默认情况下,为了与之前的 Laravel 版本保持一致,键将默认重置:
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class User extends JsonResource
{
/**
* 指示是否应保留资源的集合键。
*
* @var bool
*/
public $preserveKeys = true;
}
当 preserveKeys
属性设置为 true
时,将保留集合键:
use App\User;
use App\Http\Resources\User as UserResource;
Route::get('/user', function () {
return UserResource::collection(User::all()->keyBy->id);
});
高阶 orWhere
Eloquent 方法
在 Laravel 的先前版本中,通过 or
查询运算符组合多个 Eloquent 模型作用域需要使用闭包回调:
// 在 User 模型上定义的 scopePopular 和 scopeActive 方法...
$users = App\User::popular()->orWhere(function (Builder $query) {
$query->active();
})->get();
Laravel 5.8 引入了一个“高阶” orWhere
方法,允许您流畅地将这些作用域链接在一起,而无需使用闭包:
$users = App\User::popular()->orWhere->active()->get();
Artisan Serve 改进
在 Laravel 的先前版本中,Artisan 的 serve
命令会在端口 8000
上提供您的应用程序。如果另一个 serve
命令进程已经在此端口上侦听,则尝试通过 serve
提供第二个应用程序将失败。从 Laravel 5.8 开始,serve
现在将扫描可用端口,直到端口 8009
,允许您同时提供多个应用程序。
Blade 文件映射
在编译 Blade 模板时,Laravel 现在会在编译文件的顶部添加一个注释,其中包含原始 Blade 模板的路径。
DynamoDB 缓存 / 会话驱动程序
Laravel 5.8 引入了 DynamoDB 缓存和会话驱动程序。DynamoDB 是由 Amazon Web Services 提供的无服务器 NoSQL 数据库。dynamodb
缓存驱动程序的默认配置可以在 Laravel 5.8 缓存配置文件中找到。
Carbon 2.0 支持
Laravel 5.8 提供对 Carbon 日期操作库 ~2.0
版本的支持。
Pheanstalk 4.0 支持
Laravel 5.8 提供对 Pheanstalk 队列库 ~4.0
版本的支持。如果您在应用程序中使用 Pheanstalk 库,请通过 Composer 将您的库升级到 ~4.0
版本。