发行说明
发行说明
版本化方案
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.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 日 |
6 (LTS) | 2019 年 9 月 3 日 | 2021 年 9 月 3 日 | 2022 年 9 月 3 日 |
7 | 2020 年 3 月 3 日 | 2020 年 9 月 3 日 | 2021 年 3 月 3 日 |
Laravel 7
Laravel 7 通过引入 Laravel Sanctum,路由速度改进,自定义 Eloquent 强制转换(casts), Blade 组件标签,流畅的字符串操作,开发人员专用的 HTTP 客户端, 第一方 CORS 支持, 路由模型绑定作用域改进, 存根自定义, 数据库队列改进, 多邮箱驱动, 查询时间强制转换(casts),新的 artisan test
命令,以及各种其他错误修复和可用性改进,对 Laravel 6.x 继续进行了改善。
Laravel Sanctum
Laravel Sanctum 由 Taylor Otwell建造。
Laravel Sanctum 为 SPA (单页应用程序),移动应用程序和基于令牌的简单 API 提供了轻巧的身份验证系统。 Sanctum 允许应用程序的每个用户生成多个 API 令牌。 这些令牌可以被授予能力/作用域,用于指定允许令牌执行哪些动作。
有关 Laravel Sanctum 的更多信息, 请查看 Sanctum 文档。
自定义 Eloquent 类型转换
自定义 Eloquent 类型转换由 Taylor Otwell 开发贡献.
Laravel 内置了多种常用的类型转换。但是,用户偶尔会需要将数据转换成自定义类型。现在,该需求可以通过定义一个实现 CastsAttributes
接口的类来完成
实现了该接口的类必须事先定义一个 get
和 set
方法。 get
方法负责将从数据库中获取的原始数据转换成对应的类型,而 set
方法则是将数据转换成对应的数据库类型以便存入数据库中。举个例子,下面我们将内置的 json
类型转换以自定义类型转换的形式重新实现一遍:
<?php
namespace App\Casts;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
class Json implements CastsAttributes
{
/**
* 将取出的数据进行转换
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param mixed $value
* @param array $attributes
* @return array
*/
public function get($model, $key, $value, $attributes)
{
return json_decode($value, true);
}
/**
* 转换成将要进行存储的值
*
* @param \Illuminate\Database\Eloquent\Model $model
* @param string $key
* @param array $value
* @param array $attributes
* @return string
*/
public function set($model, $key, $value, $attributes)
{
return json_encode($value);
}
}
定义好自定义类型转换后,可以使用其类名称将其附加到模型属性:
<?php
namespace App;
use App\Casts\Json;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* 这个属性应该被转化为原生类型
*
* @var array
*/
protected $casts = [
'options' => Json::class,
];
}
要学习如何实现自定义 Eloquent 类型转换,包括转换成特定值对象的类型转换,请参照 Eloquent documentation。
Blade 组件标签和变化
Blade 组件标签贡献人员有 Spatie, Marcel Pociot, Caleb Porzio, Dries Vints, 和 Taylor Otwell.
{小提示} Blade 组件已经大刀阔斧修改,其中变化有允许基于标签的渲染,参数管理,组件类,内联视图组件众多变化。经过修改的 Blade 组件如此之多,请从这里 Blade文档 来学习这些新特性。
总结为一句,现在的一个组件能从指定的类获取数据。所有的公开属性和方法都清晰地定义在组件类里,会自动组装成组件视图。任何附加的 HTML 属性都指定于一个可以被管理的自动包含$attribute
变量的组件,它是一个属性包的实例。
下面有个例子,我们会假设一个 App\View\Components\Alert
组件定义是这样的:
<?php
namespace App\View\Components;
use Illuminate\View\Component;
class Alert extends Component
{
/**
* 提醒类型
*
* @var string
*/
public $type;
/**
* 创建组件实例.
*
* @param string $type
* @return void
*/
public function __construct($type)
{
$this->type = $type;
}
/**
*获取给提醒类型的类
*
* @return string
*/
public function classForType()
{
return $this->type == 'danger' ? 'alert-danger' : 'alert-warning';
}
/**
* 获取渲染组件的视图/内容
*
* @return \Illuminate\View\View|string
*/
public function render()
{
return view('components.alert');
}
}
并且假设 Blade 组件模板定义是这样的:
<!-- /resources/views/components/alert.blade.php -->
<div class="alert {{ $classForType() }}" {{ $attributes }}>
{{ $heading }}
{{ $slot }}
</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 Wathan,Jason 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 <code>test</code> 命令
test
命令由 Nuno Maduro 贡献
除了 phpunit
命令之外,现在可以使用 test
Artisan 命令来运行测试。 Artisan 测试运行器提供了漂亮的控制台,以及有关当前正在运行的测试的更多信息。 此外,运行器将在第一次测试失败时自动停止:
php artisan test
可以传递给 phpunit
命令的任何参数也可以传递给 Artisan test
命令:
php artisan test --group=feature
Markdown 邮件模板改进
Markdown 邮件模板改进由 Taylor Otwell 贡献
默认的Markdown邮件模板已基于Tailwind CSS调色板做出全新、更现代的设计。 当然,可以根据您的应用程序的需求来发布和定制此模板:
有关 Markdown 邮件的更多信息,请查看 邮件发送.
自定义桩代码
自定义桩代码由 Taylor Otwell贡献
Artisan 控制台的 make 命令用于创建各种类,例如控制器,任务,迁移和测试。 这些类是根据输入填充值使用「桩代码」生成文件的。 但是,有时可能希望对 Artisan 生成的文件进行小的更改。 为此,Laravel 7提供了 stub:publish
命令来发布最常见的自定义桩代码:
php artisan stub:publish
发布的桩代码将位于应用程序根目录中的 stubs
目录中。 当使用 Artisan 的 make 命令生成它们的相应类时,对这些桩代码所做的任何更改都会反映出来。
队列<code>maxExceptions</code>配置
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 次。但是,如果任务抛出三个未处理的异常,则该任务将失败。