发行说明

版本化方案

Laravel 及官方发布的包皆遵循 语义版本化。主要框架版本每六个月发布一次 (2月和8月),而次要和补丁版本可能每周发布一次。次要版本和补丁 决不 包含非兼容性更改。

引入 Laravel 框架或其组件时,应始终使用版本约束,如 ^7.0,因为 Laravel 的主要版本确实包含非兼容性更改。我们会努力确保您可以在一天或更短的时间内更新到最新版本。

支持政策

对于 LTS 版本,例如 Laravel 6,提供了 2 年的错误修复和3年的安全修复。这些版本提供了最长的支持和维护窗口。对于一般的发行版本,只提供了 6 个月的错误修复和 1 年的安全修复。对于包括 Lumen 在内的所有其他版本,只有最新版本才会修复错误。此外,请查阅 Laravel 支持的 数据库版本。

版本发布时间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 (LTS)2019 年 9 月 3 日2021 年 9 月 3 日2022 年 9 月 3 日
72020 年 3 月 3 日2020 年 9 月 3 日2021 年 3 月 3 日

Laravel 7

Laravel 7 通过引入 Laravel Airlock,路由速度改进,自定义 Eloquent 强制转换(casts), Blade 组件标签,流畅的字符串操作,开发人员专用的 HTTP 客户端, 第一方 CORS 支持, 路由模型绑定作用域改进, 存根自定义, 数据库队列改进, 多邮箱驱动, 查询时间强制转换(casts),新的 artisan test 命令,以及各种其他错误修复和可用性改进,对 Laravel 6.x 继续进行了改善。

Laravel Airlock

Laravel Airlock 由 Taylor Otwell建造。

Laravel Airlock 为 SPA (单页应用程序),移动应用程序和基于令牌的简单 API 提供了轻巧的身份验证系统。 Airlock 允许应用程序的每个用户生成多个 API 令牌。 这些令牌可以被授予能力/作用域,用于指定允许令牌执行哪些动作。

有关 Laravel Airlock 的更多信息, 请查看 Airlock 文档

自定义 Eloquent 类型转换

自定义 Eloquent 类型转换由 Taylor Otwell 开发贡献.

Laravel 内置了多种常用的类型转换。但是,用户偶尔会需要将数据转换成自定义类型。现在,该需求可以通过定义一个实现 CastsAttributes 接口的类来完成

实现了该接口的类必须事先定义一个 getset 方法。 get 方法负责将从数据库中获取的原始数据转换成对应的类型,而 set 方法则是将数据转换成对应的数据库类型以便存入数据库中。举个例子,下面我们将内置的 json 类型转换以自定义类型转换的形式重新实现一遍:

  1. <?php
  2. namespace App\Casts;
  3. use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
  4. class Json implements CastsAttributes
  5. {
  6. /**
  7. * 将取出的数据进行转换
  8. *
  9. * @param \Illuminate\Database\Eloquent\Model $model
  10. * @param string $key
  11. * @param mixed $value
  12. * @param array $attributes
  13. * @return array
  14. */
  15. public function get($model, $key, $value, $attributes)
  16. {
  17. return json_decode($value, true);
  18. }
  19. /**
  20. * 转换成将要进行存储的值
  21. *
  22. * @param \Illuminate\Database\Eloquent\Model $model
  23. * @param string $key
  24. * @param array $value
  25. * @param array $attributes
  26. * @return string
  27. */
  28. public function set($model, $key, $value, $attributes)
  29. {
  30. return json_encode($value);
  31. }
  32. }

定义好自定义类型转换后,可以使用其类名称将其附加到模型属性:

  1. <?php
  2. namespace App;
  3. use App\Casts\Json;
  4. use Illuminate\Database\Eloquent\Model;
  5. class User extends Model
  6. {
  7. /**
  8. * 这个属性应该被转化为原生类型
  9. *
  10. * @var array
  11. */
  12. protected $casts = [
  13. 'options' => Json::class,
  14. ];
  15. }

要学习如何实现自定义 Eloquent 类型转换,包括转换成特定值对象的类型转换,请参照 Eloquent documentation

Blade 组件标签和变化

Blade 组件标签贡献人员有 Spatie, Marcel Pociot, Caleb Porzio, Dries Vints, 和 Taylor Otwell.

{小提示} Blade 组件已经大刀阔斧修改,其中变化有允许基于标签的渲染,参数管理,组件类,内联视图组件众多变化。经过修改的 Blade 组件如此之多,请从这里 Blade文档 来学习这些新特性。

总结为一句,现在的一个组件能从指定的类获取数据。所有的公开属性和方法都清晰地定义在组件类里,会自动组装成组件视图。任何附加的 HTML 属性都指定于一个可以被管理的自动包含$attribute 变量的组件,它是一个属性包的实例。

下面有个例子,我们会假设一个 App\View\Components\Alert 组件定义是这样的:

  1. <?php
  2. namespace App\View\Components;
  3. use Illuminate\View\Component;
  4. class Alert extends Component
  5. {
  6. /**
  7. * 提醒类型
  8. *
  9. * @var string
  10. */
  11. public $type;
  12. /**
  13. * 创建组件实例.
  14. *
  15. * @param string $type
  16. * @return void
  17. */
  18. public function __construct($type)
  19. {
  20. $this->type = $type;
  21. }
  22. /**
  23. *获取给提醒类型的类
  24. *
  25. * @return string
  26. */
  27. public function classForType()
  28. {
  29. return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
  30. }
  31. /**
  32. * 获取渲染组件的视图/内容
  33. *
  34. * @return \Illuminate\View\View|string
  35. */
  36. public function render()
  37. {
  38. return view('components.alert');
  39. }
  40. }

并且假设 Blade 组件模板定义是这样的:

  1. <!-- /resources/views/components/alert.blade.php -->
  2. <div class="alert {{ $classForType() }}" {{ $attributes }}>
  3. {{ $heading }}
  4. {{ $slot }}
  5. </div>

组件可以被渲染在另一个使用组件标签的 Blade 视图:

<x-alert type="error" class="mb-4">
    <x-slot name="heading">
        Alert content...
    </x-slot>

    Default slot content...
</x-alert>

如前所述,在大改之后的 Laravel7 当中这是一个非常小又普通的一个功能,而且还没有演示匿名组件,内联视图组件和各种各样的其他特性。请从这里 Blade文档 来学习这些新特性

{注意} 以前的 Blade 组件 @component 语法没有被移除。

HTTP 客户端

HTTP 客户端是 Guzzle 的一个封装,由 Adam WathanJason McCreary,和 Taylor Otwell 提供。

Laravel 现在提供一套围绕 Guzzle HTTP 客户端 构建的精简且高效的 API,允许你快速向其它 web 应用发起 HTTP 请求。Laravel 基于 Guzzle 的封装专注于最常见的用例和最棒的开发人员体验。例如,客户端发起带 JSON 数据的 POST 请求变得轻而易举:

use Illuminate\Support\Facades\Http;

$response = Http::withHeaders([
    'X-First' => 'foo'
    'X-Second' => 'bar'
])->post('http://test.com/users', [
    'name' => 'Taylor',
]);

return $response['id'];

此外,HTTP 客户端还提供了令人惊叹且易于使用的测试功能:

Http::fake([
    // Stub a JSON response for GitHub endpoints...
    'github.com/*' => Http::response(['foo' => 'bar'], 200, ['Headers']),

    // Stub a string response for Google endpoints...
    'google.com/*' => Http::response('Hello World', 200, ['Headers']),

    // Stub a series of responses for Facebook endpoints...
    'facebook.com/*' => Http::sequence()
                            ->push('Hello World', 200)
                            ->push(['foo' => 'bar'], 200)
                            ->pushStatus(404),
]);

了解更多 HTTP 客户端的特性,请查阅 HTTP 客户端文档.

流畅的字符串操作

流畅的字符串操作由 Taylor Otwell 开发贡献

你可能对 Laravel 已有的 Illuminate\Support\Str 这个类比较熟悉,它提供了各种有用的字符串操作函数。基于这些函数, Laravel 7 现在提供了一个更加面向对象的、更加流畅的字符串操作库。你可以使用 Str::of 方法创建一个 Illuminate\Support\Stringable 对象。 然后可以使用该对象的各种方法去操作字符串:

return (string) Str::of('  Laravel Framework 6.x ')
                    ->trim()
                    ->replace('6.x', '7.x')
                    ->slug();

有关流畅的字符串操作可用方法的更多信息, 请查阅 完整文档

路由模型绑定优化

路由模型绑定优化由 Taylor Otwell 开发贡献

自定义键名

有时你可能希望使用 id 以外的字段来解析 Eloquent 模型。 为此, Laravel 7 允许你在路由参数中指定某个字段:

Route::get('api/posts/{post:slug}', function (App\Post $post) {
    return $post;
});

隐式绑定约束

有时,当在路由中隐式绑定多个 Eloquent 模型时,可能希望对第二个 Eloquent 模型进行约束,使其必须是第一个 Eloquent 模型的子类。例如,考虑这种情况,该情况是通过 Slug 为特定用户查找博客文章的:

use App\Post;
use App\User;

Route::get('api/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
    return $post;
});

当使用自定义键隐式绑定作为嵌套的路由参数时,Laravel 7 将自动确定查询范围,以使用约定猜测其父级上的关系名称,以其父级检索嵌套模型。在这种情况下,将假定 User 模型关联了名为 posts(路由参数名称的复数) 的关系,该关系可用于检索 Post 模型。

有关路由模型绑定的更多信息,请查阅 路由文档

多邮件驱动程序

多邮件驱动程序支持由 Taylor Otwell 贡献。

Laravel 7 允许为单个应用配置多个邮件驱动。在 mail 配置文件中的每个邮件驱动都拥有它们自己的配置以及自己独特的 「transport」,这允许你的应用使用不同的邮件服务来发送某些邮件。例如,你的应用可以使用 Postmark 发送批量邮件,使用 Amazon SES 发送公务邮件。

默认情况下,Laravel 将使用 mail 配置文件中的 default 选项指定的邮件驱动作为邮件驱动。然而,你可以通过 mailer 方法来使用特定的邮件驱动来发送邮件。

Mail::mailer('postmark')
        ->to($request->user())
        ->send(new OrderShipped($order));

路由缓存速度改进

路由缓存速度改进由上游的 Symfony 的贡献者和 Dries Vints 贡献

Laravel 7 提供了一种新的方法,用于匹配使用 Artisan 命令 route:cache 缓存的已编译缓存路由。在大型应用程序(例如,具有800条或更多路由的应用程序)上,这些改进可以使简单的「Hello World」基准测试每秒的请求速度 提高2倍 ,而无需更改应用程序。

CORS 支持

CORS 支持由 Barry vd. Heuvel 贡献

Laravel 7 通过集成由 Barry vd. Heuvel 编写的受欢迎的 Laravel CORS 软件包,为配置跨域资源共享(CORS) OPTIONS 请求响应提供了官方支持, 默认的 Laravel 应用程序框架 中包含一个新的 cors 配置。

有关 Laravel 7.x 中的 CORS 支持的更多信息,请查阅CORS文档

查询时类型转换

查询时类型转换由 Matt Barlow 开发贡献.

有时候需要在查询执行过程中对特定属性进行类型转换,例如需要从数据库表中获取数据的时候。举个例子,请参考以下查询:

use App\Post;
use App\User;

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->get();

在该查询获取到的结果集中,last_posted_at 属性将会是一个字符串。假如我们在执行查询时进行 date 类型转换将更方便。你可以通过使用 withCasts 方法来完成上述操作:

$users = User::select([
    'users.*',
    'last_posted_at' => Post::selectRaw('MAX(created_at)')
            ->whereColumn('user_id', 'users.id')
])->withCasts([
    'last_posted_at' => 'date'
])->get();

MySQL 8+ 数据库队列改进

MySQL 数据库队列改进由 Mohamed Said 开发贡献.

在先前版本的 Laravel 中, database 队列的健壮性被认为无法满足生产环境的需求。但是,Laravel 7 针对使用基于 MySQL 8+ 数据库队列的应用进行了改进。通过使用 FOR UPDATE SKIP LOCKED 语句进行 SQL 的优化,database 队列驱动可以安全地用于生产环境。

Artisan test 命令

test 命令由 Nuno Maduro 贡献

除了 phpunit命令之外,现在可以使用 test Artisan 命令来运行测试。 Artisan 测试运行器提供了漂亮的控制台,以及有关当前正在运行的测试的更多信息。 此外,运行器将在第一次测试失败时自动停止:

php artisan test

1lbycvEzUS.png!large

可以传递给 phpunit 命令的任何参数也可以传递给 Artisan test 命令:

php artisan test --group=feature

Markdown 邮件模板改进

Markdown 邮件模板改进由 Taylor Otwell 贡献

默认的Markdown邮件模板已基于Tailwind CSS调色板做出全新、更现代的设计。 当然,可以根据您的应用程序的需求来发布和定制此模板:

8JZLsex9RA.png!large

有关 Markdown 邮件的更多信息,请查看 邮件发送.

自定义桩代码

自定义桩代码由 Taylor Otwell贡献

Artisan 控制台的 make 命令用于创建各种类,例如控制器,任务,迁移和测试。 这些类是根据输入填充值使用「桩代码」生成文件的。 但是,有时可能希望对 Artisan 生成的文件进行小的更改。 为此,Laravel 7提供了 stub:publish 命令来发布最常见的自定义桩代码:

php artisan stub:publish

发布的桩代码将位于应用程序根目录中的 stubs 目录中。 当使用 Artisan 的 make 命令生成它们的相应类时,对这些桩代码所做的任何更改都会反映出来。

队列maxExceptions配置

maxExceptions属性由Mohamed Said提交贡献.

有时可能希望指定可以尝试多次的任务,但是如果重试是由给定数量的异常触发的,则该任务将失败。在Laravel7中,可以在任务类上定义 maxExceptions 属性:

<?php

namespace App\Jobs;

class ProcessPodcast implements ShouldQueue
{
    /**
     * 任务可以被重试的次数。
     *
     * @var int
     */
    public $tries = 25;

    /**
     * 失败之前允许抛出异常的最大次数。
     *
     * @var int
     */
    public $maxExceptions = 3;

    /**
     * 执行任务。
     *
     * @return void
     */
    public function handle()
    {
        Redis::throttle('key')->allow(10)->every(60)->then(function () {
            // 获取锁,处理博客进程...
        }, function () {
            // 无法获取锁...
            return $this->release(10);
        });
    }
}

在此示例中,如果应用程序无法获得 Redis 锁,则该任务将释放十秒钟,并将继续重试 25 次。但是,如果任务抛出三个未处理的异常,则该任务将失败。

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

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

Laravel China 社区:https://learnku.com/docs/laravel/7.x/releases/7444