看看 Laravel 9 的新功能

PHP开源Hub

共 7772字,需浏览 16分钟

 · 2022-02-09


Laravel v9 将是 Laravel 的下一个 LTS 版本,它将在 2022 年 2 月的某个时间发布。在这篇文章中,我们想概述迄今为止宣布的所有新功能和更改。


Laravel 9 发布日期变更

Laravel v9 原定于今年 9 月左右发布,但 Laravel 团队决定将此版本推迟到 2022 年 2 月:

Laravel 使用各种社区驱动的包以及九个 Symfony 组件来实现框架内的许多功能。Symfony 6.0 将于 11 月发布。出于这个原因,我们选择将 Laravel 9.0 的发布推迟到 2022
年。通过推迟发布,我们可以将底层的 Symfony 组件升级到 Symfony 6.0,而不必被迫等到 2022 年 9 月才能执行此升级。此外,这更好地为我们未来的发布做好了准备,因为我们的年度发布总是在 Symfony 发布后两个月发布。

这也将推动未来的主要版本,以下是未来的时间表:

  • Laravel 9:2022 年 2 月 8 日

  • Laravel 10:2023 年 2 月 7 日

PHP 8 将成为 Laravel 9 中的最低版本

由于 Laravel 9 需要 Symfony 6.0 并且它的最低要求是 PHP 8,这意味着 Laravel 9 将具有同样的限制。


新的路由列表设计

routes:list命令已经包含在 Laravel 中很长时间了,有时会出现的一个问题是,如果您定义了庞大而复杂的路由,则尝试在控制台中查看它们可能会变得混乱。多亏了Nuno Maduro 的 PR,让路由列表有了新的设计。

新的测试覆盖选项

一个新artisan test --coverage选项将直接在终端上显示测试覆盖率。它还包括一个--min选项,您可以使用该选项来指示测试覆盖率的最低阈值强制执行。

匿名的数据库迁移类

今年早些时候,Laravel 8.37 推出了一个名为Anonymous Migrations的新功能,可以防止迁移类名称冲突。

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {

/**
* Run the migrations.
*
* @return void
*/

public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->string('first_name')->nullable();
});
}
};

当 Laravel 9 发布时,这将是你运行 php artisan make:migration 时的默认设置 。


新的查询构造器

感谢 Chris Morrell,Laravel 9 将提供一个新的 Query Builder 界面,你可以看到这个合并的 PR以了解所有细节。


对于在 IDE 中依赖类型提示进行静态分析、重构或代码完成的开发人员来说,缺乏共享接口或 IDE 之间的继承可能Query\Builder非常棘手:Eloquent\BuilderEloquent\Relation

return Model::query()
->whereNotExists(function($query) {
// $query is a Query\Builder
})
->whereHas('relation', function($query) {
// $query is an Eloquent\Builder
})
->with('relation', function($query) {
// $query is an Eloquent\Relation
});

此功能添加了一个新的 Illuminate\Contracts\Database\QueryBuilder 接口和一个 Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder 实现该接口以代替现有 __call 实现的特征。


PHP 8 字符串函数

由于 PHP 8 将是最低要求,Tom Schlick 提交了一个PR以在类内部使用str_contains(),str_starts_with()str_ends_with()函数。\Illuminate\Support\Str


从 SwiftMailer 到 Symfony Mailer

Symfony Mailer 的支持由Dries VintsJames BrooksJulius Kiekbusch 提供

以前的 Laravel 版本使用Swift Mailer库来发送外发电子邮件。但是,该库不再维护,并由 Symfony Mailer 接替。

请查看升级指南以了解有关确保您的应用程序与 Symfony Mailer 兼容的更多信息。

Flysystem 3.x

Flysystem 3.x 支持由Dries Vints 提供

Laravel 9.x 将我们上游的 Flysystem 依赖升级到 Flysystem 3.x。Flysystem 为Storage外观提供的所有文件系统交互提供支持。

改进的 Eloquent Accessors / Mutators

Taylor Otwell贡献了改进的 Eloquent 访问器/修改器。

Laravel 9.x 提供了一种定义 Eloquent访问器和修改器的新方法。在之前的 Laravel 版本中,定义访问器和修改器的唯一方法是在模型上定义前缀方法,如下所示:

public function getNameAttribute($value)
{
return strtoupper($value);
}

public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}

但是,在 Laravel 9.x 中,您可以使用单个非前缀方法通过类型提示返回类型来定义访问器和修改器Illuminate\Database\Eloquent\Casts\Attribute

use Illuminate\Database\Eloquent\Casts\Attribute;

public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}

此外,这种定义访问器的新方法将缓存属性返回的对象值,就像自定义转换类一样:

use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;

public function address(): Attribute
{
return new Attribute(
get: fn ($value, $attributes) => new Address(
$attributes['address_line_one'],
$attributes['address_line_two'],
),
set: fn (Address $value) => [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
],
);
}

使用枚举的隐式路由绑定

隐式枚举绑定由Nuno Maduro贡献。

PHP 8.1 引入了对Enums的支持。Laravel 9.x 引入了在路由定义中键入提示 Enum 的能力,并且 Laravel 只会在该路由段是 URI 中的有效 Enum 值时调用该路由。否则,将自动返回 HTTP 404 响应。例如,给定以下枚举:

enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}

{category}您可以定义仅当路由段为fruits时才会调用的路由people否则,将返回 HTTP 404 响应:

Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});


控制器路由组

路由组改进由Luke Downing贡献。

您现在可以使用该controller方法为组内的所有路由定义公共控制器。然后,在定义路由时,您只需要提供它们调用的控制器方法:

use App\Http\Controllers\OrderController;

Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});

Enum Eloquent 属性转换

枚举转换仅适用于 PHP 8.1+。

枚举铸造由Mohamed Said贡献。

Eloquent 现在允许您将属性值转换为 PHP 枚举。为此,您可以在模型的$casts属性数组中指定要强制转换的属性和枚举:

use App\Enums\ServerStatus;

/**
* The attributes that should be cast.
*
* @var array
*/

protected $casts = [
'status' => ServerStatus::class,
];

一旦你在你的模型上定义了转换,当你与属性交互时,指定的属性将自动转换为枚举:

if ($server->status == ServerStatus::provisioned) {
$server->status = ServerStatus::ready;

$server->save();
}

强制范围绑定

强制范围绑定由Claudio Dekker贡献。

在之前的 Laravel 版本中,您可能希望在路由定义中限定第二个 Eloquent 模型,使其必须是之前 Eloquent 模型的子模型。例如,考虑这个通过 slug 为特定用户检索博客文章的路由定义:

use App\Models\Post;
use App\Models\User;

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

当使用自定义键控隐式绑定作为嵌套路由参数时,Laravel 将自动限定查询范围以通过其父级检索嵌套模型,使用约定来猜测父级上的关系名称。但是,当自定义键用于子路由绑定时,Laravel 之前仅支持此行为。

但是,在 Laravel 9.x 中,即使没有提供自定义键,您现在也可以指示 Laravel 限定“子”绑定的范围。为此,您可以scopeBindings在定义路由时调用该方法:

use App\Models\Post;
use App\Models\User;

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

或者,您可以指示整个路由定义组使用范围绑定:

Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});

Laravel Breeze API & Next.js

Laravel Breeze API 脚手架和 Next.js 入门套件由Taylor OtwellMiguel Piedrafita贡献。

Laravel Breeze 入门套件已经获得了“API”脚手架模式和免费的 Next.js 前端实现这个初学者工具包脚手架可用于快速启动用作后端的 Laravel 应用程序,以及用于 JavaScript 前端的 Laravel Sanctum 认证 API。

Laravel Scout 数据库引擎

Laravel Scout 数据库引擎由Taylor OtwellDries Vints 贡献

如果您的应用程序与中小型数据库交互或工作负载较轻,您现在可以使用 Scout 的“数据库”引擎,而不是 Algolia 或 MeiliSerach 等专用搜索服务。数据库引擎将在过滤现有数据库的结果时使用“where like”子句和全文索引,以确定查询的适用搜索结果。

全文索引 / Where 语句

全文索引和“where”子句由Taylor OtwellDries Vints 提供

当使用 MySQL 或 PostgreSQL 时,该fullText方法现在可以添加到列定义中以生成全文索引:

$table->text('bio')->fullText();

此外,whereFullTextandorWhereFullText方法可用于将全文“where”子句添加到具有全文索引的列的查询中。这些方法将被 Laravel 转换成适合底层数据库系统的 SQL。例如,MATCH AGAINST将为使用 MySQL 的应用程序生成一个子句:

$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();

渲染内联 Blade 模板

有时您可能需要将原始 Blade 模板字符串转换为有效的 HTML。您可以使用外观render提供的方法来完成此操作。Bladerender方法接受 Blade 模板字符串和提供给模板的可选数据数组:

use Illuminate\Support\Facades\Blade;

return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

Soketi Echo 服务器

Soketi Echo 服务器由Alex Renoki开发。

虽然不是 Laravel 9.x 独有的,但 Laravel 最近协助编写了 Soketi 的文档,这是一个为 Node.js 编写的与Laravel Echo兼容的 Web Socket 服务器。Soketi 为那些喜欢管理自己的 Web Socket 服务器的应用程序提供了一个很好的、开源的替代 Pusher 和 Ably。

Bootstrap 5 分页视图

Laravel 现在包含使用Bootstrap 5构建的分页视图。要使用这些视图而不是默认的 Tailwind 视图,您可以在类的方法中调用分页器的useBootstrapFive方法bootApp\Providers\AppServiceProvider

use Illuminate\Pagination\Paginator;

/**
* Bootstrap any application services.
*
* @return void
*/

public function boot()
{
Paginator::useBootstrapFive();
}

改进的 Ignition 异常页面

Spatie 创建的开源异常调试页面 Ignition 已经从头开始重新设计。新的、改进的 Ignition 随 Laravel 9.x 一起提供,包括浅色/深色主题、可定制的“在编辑器中打开”功能等等。

新的助手函数

Laravel 9.x 引入了两个新的、方便的辅助函数,你可以在自己的应用程序中使用它们。

str()

str函数返回Illuminate\Support\Stringable给定字符串的新实例。这个函数等价于Str::of方法:

$string = str('Ning')->append(' Zelin');

// 'Ning Zelin'

如果没有为str函数提供参数,则函数返回 的实例Illuminate\Support\Str

$snake = str()->snake('LaravelFramework');

// 'laravel_framework'

to_route()

to_route函数为给定的命名路由生成重定向 HTTP 响应,提供了一种从路由和控制器重定向到命名路由的表达方式:

return to_route('users.show', ['user' => 1]);

如有必要,您可以将应分配给重定向的 HTTP 状态代码和任何其他响应标头作为第三个和第四个参数传递给 to_route 方法:

return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);

server.php 文件可以删除

一个次要功能,但您现在可以server.php从项目中删除该文件,它将包含在框架中。此文件仅用于php artisan serve.

其他...

Laravel 9 还需要几天的时间,更多的新功能和公告将会发布。


浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报