返回

Laravel 7发行说明

发布时间:2022-10-09 04:06:31 325
# php# 数据库# git# 数据# 软件

版本化方案

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 组件模板定义是这样的:




{{ $heading }}

{{ $slot }}

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



Alert content...


Default slot content...

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

 

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

 

HTTP 客户端

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

Laravel 现在提供一套围绕 Guzzle HTTP 客户端](​​http://docs.guzzlephp.org/en/stable/​​​) 构建的精简且高效的 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

Laravel 7发行说明_自定义

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

php artisan test --group=feature

Markdown 邮件模板改进

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

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

Laravel 7发行说明_laravel_02

 

有关 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 次。但是,如果任务抛出三个未处理的异常,则该任务将失败。

 

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线