发行说明

语义化版本

Laravel 和官方扩展包将正式遵循 语义化版本。每六个月会发布一个大版本(如:6.0、7.0),每周可能会有小版本和补丁版本发布。小版本和补丁 绝不 包含破坏性变更。

当你在项目或者扩展包依赖于 Laravel 框架时,因大版本会包含破坏性变更,故必须使用大版本限制,如:^6.0。即便如此,我们仍然会努力减低你升级时的耗时,使其控制在一天或者更少。

支持策略

对于 LTS 版本,例如 Laravel 6.0,将会提供为期两年的错误修复和三年的安全修复。这些版本提供了最长时间的支持和维护。对于一般版本,只会提供六个月的错误修复和一年的安全修复。对于所有其他库,包括 Lumen ,只有最新版本会得到错误修复。

版本发布时间Bug 修复截止时间安全修复截止时间
5.5 (LTS)2017 年 8 月 30 日2019 年 8 月 30 日2020 年 8 月 30 日
5.62018 年 2 月 7 日2018 年 8 月 7 日2019 年 2 月 7 日
5.72018 年 9 月 4 日2019 年 3 月 4 日2019 年 9 月 4 日
5.82019 年 2 月 26 日2019 年 8 月 26 日2020 年 2 月 26 日
6.0 (LTS)2019 年 9 月 3 日2021 年 9 月 3 日2022 年 9 月 3 日

Laravel 6.0

Laravel 6.0(LTS)通过引入语义化版本、与Laravel Vapor的兼容性、优化了授权响应、任务中间件、懒集合、子查询优化、并将前端脚手架单独分离到laravel/ui Composer 软件包,以及其他各种错误修复和可用性改进。

语义版本控制

laravel 框架扩展包现在开始使用语义化版本。这使得框架与已经遵循此版本控制标准的其他第一方Laravel包保持一致。Laravel发布周期将保持不变。

Laravel Vapor 兼容性

Laravel Vapor由Taylor Otwell开发。

Laravel 6.0提供了与Laravel Vapor的兼容性,这是一个用于Laravel的自动伸缩无服务器部署平台。vapor抽象了管理aws lambda上的laravel应用程序的复杂性,以及将这些应用程序与sqs队列、数据库、redis集群、网络、 CloudFront CDN等接口的复杂性。

改进的异常:Ignition

Laravel 自带了 Ignition,这是一个由 Freek Van der Herten 与 Marcel Pociot 创建的关于异常详情页面的新的开源项目。相较之前的版本,Ignition 具有许多优势,比如改进的错误页面 Blade 文件与行号处理、对常见问题的运行时解决、代码编辑、异常共享以及改进的用户体验。

改进的授权响应

改进的授权响应由 Gary Green 实现。

在之前的 Laravel 版本中,很难提取并向最终的用户展示自定义的授权消息,这就导致了很难跟最终用户解释某个特定请求为什么会被拒绝。在 Laravel 6.0 中,使用授权响应消息和新方法 Gate::inspect 将会让事情变得更加容易。比如,给定以下授权策略(Policy)方法:

  1. /**
  2. * 判断用户能否查看指定的航班
  3. *
  4. * @param \App\User $user
  5. * @param \App\Flight $flight
  6. * @return mixed
  7. */
  8. public function view(User $user, Flight $flight)
  9. {
  10. return $this->deny('Explanation of denial.');
  11. }

使用 Gate::inspect 方法可以很容易地提取出授权策略的响应和消息:

  1. $response = Gate::inspect('view', $flight);
  2. if ($response->allowed()) {
  3. // 用户被允许查看该航班……
  4. }
  5. if ($response->denied()) {
  6. echo $response->message();
  7. }

除此之外,当你在路由或者控制器中使用了诸如 $this->authorizeGate::authorize 的辅助方法后,这些自定义信息将能够自动地返回给你的前端。

任务中间件

任务中间件是由 Taylor Otwell 实现的

任务中间件允许你围绕任务队列的执行封装自定义逻辑,从而减少任务本身的引用。例如:在 Laravel 的上一个发行版本里,你可能封装了一个有关速率限制的回调逻辑在任务的 handle 方法中:

  1. /**
  2. * 执行任务
  3. *
  4. * @return void
  5. */
  6. public function handle()
  7. {
  8. Redis::throttle('key')->block(0)->allow(1)->every(5)->then(function () {
  9. info('获取锁...');
  10. // 处理任务...
  11. }, function () {
  12. // 无法获取锁...
  13. return $this->release(5);
  14. });
  15. }

在 Laravel 6.0 里,这个逻辑可以被提取到一个任务中间件中,从而让你任务的 handle 方法不用承担任何速率限制的职责:

  1. <?php
  2. namespace App\Jobs\Middleware;
  3. use Illuminate\Support\Facades\Redis;
  4. class RateLimited
  5. {
  6. /**
  7. * 处理任务队列
  8. *
  9. * @param mixed $job
  10. * @param callable $next
  11. * @return mixed
  12. */
  13. public function handle($job, $next)
  14. {
  15. Redis::throttle('key')
  16. ->block(0)->allow(1)->every(5)
  17. ->then(function () use ($job, $next) {
  18. // 获取锁...
  19. $next($job);
  20. }, function () use ($job) {
  21. // 无法获取锁...
  22. $job->release(5);
  23. });
  24. }
  25. }

创建中间件之后,它们可以通过返回任务的 middleware 方法连接到任务:

  1. use App\Jobs\Middleware\RateLimited;
  2. /**
  3. * 获得任务的中间件
  4. *
  5. * @return array
  6. */
  7. public function middleware()
  8. {
  9. return [new RateLimited];
  10. }

懒集合

懒集合 由 Joseph Silber开发 。

许多开发者已经感受到了 Laravel集合 的强大。为了补充已经很强大的 集合 类, Laravel 6.0 引入了 一个,利用 PHP生成器 来实现的 懒集合,允许你使用非常大的数据集合的同时保持较低的内存使用率。

例如,想像你的应用程序需要处理 1 个多 GB 大小的日志文件,同时利用 Laravel 的集合来解析日志。通过懒集合可以在给定时间内仅将文件的一部分保留在内存中,而不是一次将整个文件都读入内存:

  1. use App\LogEntry;
  2. use Illuminate\Support\LazyCollection;
  3. LazyCollection::make(function () {
  4. $handle = fopen('log.txt', 'r');
  5. while (($line = fgets($handle)) !== false) {
  6. yield $line;
  7. }
  8. })
  9. ->chunk(4)
  10. ->map(function ($lines) {
  11. return LogEntry::fromLines($lines);
  12. })
  13. ->each(function (LogEntry $logEntry) {
  14. // Process the log entry...
  15. });

或者,想像你需要迭代 10,000 个 Eloquent 模型,使用传统 Laravel 集合时,所有 10,000 个 Eloquent 模型必须同时加载到内存中:

  1. $users = App\User::all()->filter(function ($user) {
  2. return $user->id > 500;
  3. });

然而,从 Laravel 6.0 开始,查询构建器的 cursor 方法已经更新为返回 懒集合 实例。虽然你仍然只能运行单个查询,但是一次只会在内存中保留一个 Eloquent 模型。在整个例子中,直到我们真正迭代完每个用户之后,filter 回调才会执行,从而大大减少了内存的使用:

  1. $users = App\User::cursor()->filter(function ($user) {
  2. return $user->id > 500;
  3. });
  4. foreach ($users as $user) {
  5. echo $user->id;
  6. }

Eloquent 子查询增强功能

Eloquent 子查询增强功能是由 Jonathan Reinink 实现的

Laravel 6.0 引入了几个对数据库子查询支持的新增强和改进。例如,假设我们有一个航班 destinations 表和一个飞往目的地的 flights 表。flights 表包含一个arrived_at 列,表示航班何时到达目的地。

使用 Laravel 6.0 中新的子查询选择功能,我们可以使用一个查询选择所有的 destinations 和最近到达该目的地的航班的名称:

  1. return Destination::addSelect(['last_flight' => Flight::select('name')
  2. ->whereColumn('destination_id', 'destinations.id')
  3. ->orderBy('arrived_at', 'desc')
  4. ->limit(1)
  5. ])->get();

并且我们可以使用添加到查询生成器的 orderBy 函数中的新子查询功能,根据最后一次航班到达目的地的时间对所有目的地进行排序。同样,这可以在对数据库执行单个查询时完成:

  1. return Destination::orderByDesc(
  2. Flight::select('arrived_at')
  3. ->whereColumn('destination_id', 'destinations.id')
  4. ->orderBy('arrived_at', 'desc')
  5. ->limit(1)
  6. )->get();

Laravel UI

通常在早期版本的 Laravel 中提供的前端脚手架已被提取到 laravel/ui Composer 包中。这将允许 UI 脚手架本身可以独立于主框架进行开发和版本化。经过此次更改,默认框架脚手架中已经不存在 BootstrapVue 代码,并且还从框架中提取了 make:auth 命令。

你可以通过安装 laravel/ui 包并使用 ui Artisan 命令安装前端脚手架 ,来恢复前期 Laravel 版本中的传统 Vue / Bootstrap 脚手架:

  1. composer require laravel/ui
  2. php artisan ui vue --auth

本文章首发在 LearnKu.com 网站上。

本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接 我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。