发行说明
发行说明#
版本控制方案#
Laravel 的版本控制方案使用以下约定: 主版本号.次版本号.修订号
。次版本号框架每六个月(二月和八月)发布,而修订号版本可能每周发布一次,修订号版本 不 包含重大更改。
当你从应用程序中或者在包中引用 Laravel 框架或者其他组件时,应该始终使用版本约束,例如 5.7.*
,因为 Laravel 的次要版本包含重大更改。但是,我们会努力确保你可以在一天或者更短时间内完成更新。
主要版本之间的发布往往需要很多年,每次发布代表框架架构和底层结构发生了根本的改变。而目前并没有准备开发主版本号的计划。
支持策略#
对于 LTS 版本,例如 5.5,提供两年的错误修复和三年的安全修复。这些版本提供最长时间的支持和维护。对于一般版本,则只是提供六个月的错误修复和一年的安全修复。
版本 | 发布时间 | Bug 修复截止时间 | 安全修复截止时间 |
---|---|---|---|
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 年 9 月 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 的基础上继续进行优化,包括引入新的 Eloquent 关联关系(has-one-through)、优化邮箱验证、基于约定的授权策略类自动注册、 DynamoDB 缓存及 Session 驱动、优化任务调度器的时区配置、支持分配多个认证 guard 到广播频道、PSR-16 缓存驱动规范、优化 artisan serve
命令、支持 PHPUnit 8.0、支持 Carbon 2.0 、支持 Pheanstalk 4.0 ,以及多个 bug 修复和可用性的提升。
Eloquent HasOneThrough
关联关系#
Eloquent 现在提供了对 hasOneThrough
关联类型的支持。例如,假设 Supplier 模型类与 Account 模型类之间是一对一关联,并且 Account 模型类与 AccountHistory 模型类之间也是一对一关联,那么 Supplier 模型类与 AccountHistory 模型类之间可以通过 hasOneThrough
方法基于 Account 模型类建立远层的一对一关联。你可以用 hasOneThrough
关联关系通过 Account 模型类访问 AccountHistory 模型类:
/**
* Get the account history for the supplier.
*/
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) {
// return policy class name...
});
注意:任何被显式地映射到
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 之前发行的版本中,私有和到场广播频道通过应用的默认认证 guard 对用户进行认证。从 Laravel 5.8 开始,你可以分配多个 guard 来对请求进行认证:
Broadcast::channel('channel', function() {
// ...
}, ['guards' => ['web', 'admin']])
Token Guard 令牌哈希算法#
Laravel 中提供基本 API 认证的 token
guard,现在支持以 SHA-256 哈希算法对 API 令牌进行存储。这比存储纯文本令牌更加安全。要了解更多有关哈希令牌的细节,请查阅完整的 API 认证文档。
注: 即便 Laravel 提供了一个关简单的、基于令牌的认证 guard ,考虑到健壮性和提供了 API 认证的线上应用,我们强烈推荐你使用 Laravel Passport 。
改进 Email 验证器#
Laravel 5.8 采用了 SwiftMailer 的 egulias/email-validator
包,改进了 email 验证器的验证逻辑。之前的 Laravel Email 验证逻辑认为有效的邮件地址,比如 example@bär.se
,现在可能会被判定无效。
默认定时任务时区#
Laravel 允许用户使用 timezone
方法来自定义定时任务的时区:
$schedule->command('inspire')
->hourly()
->timezone('America/Chicago');
如果你为每个定时任务都定义一个时区的话,这样会比较繁琐与麻烦。更简便的方法是在 app/Console/Kernel.php
文件内定义一个 schedule Timezone
方法。这个方法将会把默认时区返回给所有的定时任务:
/**
* 获取默认定时任务时区。
*
* @return \DateTimeZone|string|null
*/
protected function scheduleTimezone()
{
return 'America/Chicago';
}
中间表 /pivot 模型事件#
在之前版本的 Laravel 中,当附着,分离或同自定义中间表 / 多对多关系的 “pivot” 模型时 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
{
/**
* Indicates if the resource's collection keys should be preserved.
*
* @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
query 操作符来合并多个 Eloquent 模型作用域须使用闭包回调:
// scopePopular 和 scopeActive 方法定义在 User 模型中...
$users = App\User::popular()->orWhere(function (Builder $query) {
$query->active();
})->get();
Lavavel 5.8 引进了 「高阶」 orWhere
方法,使你可以不用闭包,从而实现对作用域的流畅链式调用。
$users = App\User::popular()->orWhere->active()->get();
Artisan Serve 改进#
在之前发布的 Laravel 中,Artisan 的 serve
方法会启动你的应用服务,监听 8000
端口。 如果一个 serve
命令进程已经启动并占用了这个端口,那么通过 serve
命令尝试启动第二个应用服务将会失败。从 Laravel 5.8 起, serve
会扫描可用的端口直到 8009
,让你可以同时启动多个应用服务。
模板文件映射#
当编译 Blade 模板时,Laravel 现在会在编译文件的顶部添加注释,其中包含原始 Blade 模板路径。
DynamoDB 缓存 / Session 驱动#
Laravel 5.8 引入了 DynamoDB 缓存和 session 驱动。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
发行版。
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。
推荐文章: