版本控制方案

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 关联类型的支持。例如,假设 Supplier 模型类与 Account 模型类之间是一对一关联,并且 Account 模型类与 AccountHistory 模型类之间也是一对一关联,那么 Supplier 模型类与 AccountHistory 模型类之间可以通过 hasOneThrough 方法基于 Account 模型类建立远层的一对一关联。你可以用 hasOneThrough 关联关系通过 Account 模型类访问 AccountHistory 模型类:

  1. /**
  2. * Get the account history for the supplier.
  3. */
  4. public function accountHistory()
  5. {
  6. return $this->hasOneThrough(AccountHistory::class, Account::class);
  7. }

自动寻找模型策略

当使用 Laravel 5.7 时,每个模型对应的 认证策略 都需要被显式地注册到应用的 AuthServiceProvider 中:

  1. /**
  2. * 当前应用的策略对应关系
  3. *
  4. * @var array
  5. */
  6. protected $policies = [
  7. 'App\User' => 'App\Policies\UserPolicy',
  8. ];

Laravel 5.8 引进了模型策略的自动寻找,只要模型和策略的命名符合 Laravel 的标准约定。即策略必须在 Policies 路径下,该路径之上包含模型。举个例子,模型可能放在 app 路径下,则策略可以在放 app/Policies 路径下。另外,策略名称必须匹配模型名称并且加上 Policy 后缀。这样, User 模型将会对应上 UserPolicy 类。

如果你想要提供自己的策略寻找逻辑,你可以使用 Gate::guessPolicyNamesUsing 方法来注册一个自定义的回调函数。通常来说,这个方法应该从你应用的 AuthServiceProvider 中被调用:

  1. use Illuminate\Support\Facades\Gate;
  2. Gate::guessPolicyNamesUsing(function ($modelClass) {
  3. // return policy class name...
  4. });
{note} 任何被显式地映射到 AuthServiceProvider 中的策略都将优先于隐式自动寻找策略。

PSR-16 缓存规范

为了在存储缓存项时允许更细粒度的过期时间并遵守 PSR-16 缓存标准,我们将缓存项的有效期单位从分钟调整到秒。Illuminate\Cache\Repository 及其扩展类的 putputManyaddremembersetDefaultCacheTime 方法以及每个缓存存储实现类的 put 方法对应的有效期单位都做了这样的调整。可以查看 相关的PR 了解更多细节。

如果你的代码中调用了上述方法,需要对相应代码进行更新以确保现在传递的有效期时间与之前一致(单位变成了秒,而不是之前的分钟),作为替代方案,你还可以传递一个 DateTime 实例来标识缓存项的过期时间:

  1. // Laravel 5.7 - 缓存30分钟...
  2. Cache::put('foo', 'bar', 30);
  3. // Laravel 5.8 - 缓存30秒...
  4. Cache::put('foo', 'bar', 30);
  5. // Laravel 5.7 / 5.8 - 缓存30秒...
  6. Cache::put('foo', 'bar', now()->addSeconds(30));

多个广播认证看守器

在 Laravel 之前发行的版本中,私有和到场广播频道通过应用的默认认证 guard 对用户进行认证。从 Laravel 5.8 开始,你可以分配多个 guard 来对请求进行认证:

  1. Broadcast::channel('channel', function() {
  2. // ...
  3. }, ['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 方法来自定义定时任务的时区:

  1. $schedule->command('inspire')
  2. ->hourly()
  3. ->timezone('America/Chicago');

如果你为每个定时任务都定义一个时区的话,这样会比较繁琐与麻烦。更简便的方法是在 app/Console/Kernel.php 文件内定义一个 schedule Timezone 方法。这个方法将会把默认时区返回给所有的定时任务:

  1. /**
  2. * 获取默认定时任务时区。
  3. *
  4. * @return \DateTimeZone|string|null
  5. */
  6. protected function scheduleTimezone()
  7. {
  8. return 'America/Chicago';
  9. }

中间表 / pivot 模型事件

在之前版本的 Laravel 中,当附着,分离或同自定义中间表 / 多对多关系的 “pivot” 模型时 Eloquent 模型事件不会被派遣。在现在的 Laravel 5.8 中,使用 定制中间表模型 时,这些事件都将被派遣。

Artisan 调用改进

Laravel 允许你通过 Artisan::call 方法来调用 Artisan 。在之前发布的 Laravel 中,命令的选项是通过一个数组作为第二个参数来传递到方法中的:

  1. use Illuminate\Support\Facades\Artisan;
  2. Artisan::call('migrate:install', ['database' => 'foo']);

然而,Laravel 5.8 允许你传递完整的命令,包括其选项。它将作为第一个字符串参数到方法中:

  1. Artisan::call('migrate:install --database=foo');

Mock / Spy 测试辅助方法

为了创建模拟对象更加方便, 新的 mockspy 方法已经加入到基础 Laravel 测试用例中。这些方法自动的绑定模拟类到容器中。例如:

  1. // Laravel 5.7
  2. $this->instance(Service::class, Mockery::mock(Service::class, function ($mock) {
  3. $mock->shouldReceive('process')->once();
  4. }));
  5. // Laravel 5.8
  6. $this->mock(Service::class, function ($mock) {
  7. $mock->shouldReceive('process')->once();
  8. });

Eloquent 资源键保持

当从路由中返回 Eloquent 资源集合 时, Laravel 会重置集合的键以使他们按简单的数字顺序排列:

  1. use App\User;
  2. use App\Http\Resources\User as UserResource;
  3. Route::get('/user', function () {
  4. return UserResource::collection(User::all());
  5. });

当使用 Laravel 5.8 时, 你可以添加一个 preserveKeys 属性到资源类表明资源类的键是否保留。默认情况下,为了和之前版本的 Laravel 保持一致,这些键会被重置:

  1. <?php
  2. namespace App\Http\Resources;
  3. use Illuminate\Http\Resources\Json\JsonResource;
  4. class User extends JsonResource
  5. {
  6. /**
  7. * Indicates if the resource's collection keys should be preserved.
  8. *
  9. * @var bool
  10. */
  11. public $preserveKeys = true;
  12. }

preserveKeys 的属性值设置为 true时, 集合键会被保留:

  1. use App\User;
  2. use App\Http\Resources\User as UserResource;
  3. Route::get('/user', function () {
  4. return UserResource::collection(User::all()->keyBy->id);
  5. });

在之前发布的Laravel中,通过 or query 操作符来合并多个 Eloquent 模型作用域须使用闭包回调:

  1. // scopePopular 和 scopeActive 方法定义在 User 模型中...
  2. $users = App\User::popular()->orWhere(function (Builder $query) {
  3. $query->active();
  4. })->get();

Lavavel 5.8 引进了 「高阶」 orWhere 方法,使你可以不用闭包,从而实现对作用域的流畅链式调用。

  1. $users = App\User::popular()->orWhere->active()->get();

Artisan Serve 改进

在之前发布的Laravel中,Artisan 的 serve 方法会启动你的应用服务,监听 8000 端口。 如果一个 serve 命令进程已经启动并占用了这个端口,那么通过 serve 命令尝试启动第二个应用服务将会失败。从 Laravel 5.8 起, serve 会扫描可用的端口直到 8009 ,让你可以同时启动多个应用服务。

模板文件映射

当编译 Blade 模板时,Laravel 现在会在编译文件的顶部添加注释,其中包含原始 Blade 模板路径。

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 发行版。