Laravel 9 LTS 正式发布

2022-10-11 21:00:20 167 0
魁首哥

laravel 9 LTS 在2022年2月8日正式发布

版本

PHP (*)

发布

错误修复直到

安全修复直到

6 (长期)

7.2 – 8.0

2019 年 9 月 3 日

2022 年 1 月 25 日

2022 年 9 月 6 日

7

7.2 – 8.0

2020 年 3 月 3 日

2020 年 10 月 6 日

2021 年 3 月 3 日

8

7.3 – 8.1

2020 年 9 月 8 日

2022 年 7 月 26 日

2023 年 1 月 24 日

9(长期)

8.0 – 8.1

2022 年 2 月 8 日

2024 年 2 月 8 日

2025 年 2 月 8 日

10

8.0 – 8.1

2023 年 2 月 7 日

2024 年 8 月 7 日

2025 年 2 月 7 日

Laravel 9

随着 Laravel 8 的发布, Laravel 过渡到了年度发布。以前,主要版本没有 6 个月发布一次。这种转变旨在减轻社区的维护负担,并挑战我们的开发团队在不引入重大更改的情况下发布令人惊叹的强大新功能。因此,我们在不破坏向后兼容性的情况下为 Laravel 8 提供了各种强大的功能,例如并行测试支持、改进的 Breeze 入门工具包、HTTP 客户端改进,甚至是新的 Eloquent 关系类型,例如“具有多者之一”。

因此,在当前版本中发布重要新功能的承诺可能会导致未来的“主要”版本主要用于“维护”任务,例如升级上游依赖项,这可以在这些发行说明中看到。

Laravel 9 通过引入对 Symfony 6.0 组件、Symfony Mailer、Flysystem 3.0 的支持、改进 route:list 的输出、Laravel Scout 数据库驱动程序、新的系统 Eloquent 访问器/修改器语法、通过枚举的隐式路由绑定以及各种其他错误修复和可用性改进。

PHP8.0

Laravel 9.x 要求最低 PHP 版本为 8.0。

Flysystem 3.x

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

改进的 Eloquent Accessors / Mutators

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,
        ],
    );
}  

Enum Eloquent 属性转换

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();}  

使用枚举的隐式路由绑定

隐式枚举绑定由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;});  

路由绑定的强制范围

强制范围绑定由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;    });});  

控制器路由组

路线组改进由Luke Downing 贡献。

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

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

全文索引 / Where 子句

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

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

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

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

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

Laravel Scout 数据库引擎

Laravel Scout 数据库引擎由Taylor Otwell和Dries Vints 贡献

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

要了解有关 Scout 数据库引擎的更多信息,请参阅Scout 文档。

渲染内联刀片模板

渲染内联 Blade 模板由Jason Beggs贡献。渲染内联 Blade 组件由Toby Zerner 贡献。

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

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

类似地,该 renderComponent 方法可用于通过将组件实例传递给该方法来呈现给定的类组件:

 use App\View\Components\HelloComponent; return Blade::renderComponent(new HelloComponent('Julian Bashir'));  

插槽名称快捷方式

插槽名称快捷方式由Caleb Porzio提供。

在以前的 Laravel 版本中,插槽名称是使用标签 name 上的属性提供的: x-slot

 alert >            Server Error         Whoops! Something went wrong!  

但是,从 Laravel 9.x 开始,您可以使用更方便、更短的语法来指定插槽的名称:

     Server Error  

检查/选定的刀片指令

检查和选择的 Blade 指令由Ash Allen和Taylor Otwell 提供

为方便起见,您现在可以使用该 @checked 指令轻松指示给定的 HTML 复选框输入是否被“选中”。 checked 如果提供的条件评估为:此指令将回显 true

 active)) />  

同样,该 @selected 指令可用于指示是否应该“选择”给定的选择选项:

   

Bootstrap 5 分页视图

Bootstrap 5 分页视图由Jared Lewis 贡献。

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

 use Illuminate\Pagination\Paginator; /** * Bootstrap any application services. * * @return  void  */public function boot(){    Paginator::useBootstrapFive();}  

改进了嵌套数组数据的验证

Steve Bauman贡献了对嵌套数组输入的改进验证

有时,在为属性分配验证规则时,您可能需要访问给定嵌套数组元素的值。您现在可以使用该 Rule::forEach 方法完成此操作。该 forEach 方法接受一个闭包,该闭包将为验证下的数组属性的每次迭代调用,并将接收属性的值和显式的、完全扩展的属性名称。闭包应该返回一个规则数组来分配给数组元素:

 use App\Rules\HasPermission;use Illuminate\Support\Facades\Validator;use Illuminate\Validation\Rule; $validator = Validator::make($ request ->all(), [    'companies.*.id' => Rule::forEach(function ($value, $attribute) {        return [            Rule:: exists (Company::class, 'id'),            new HasPermission('manage-company', $value),        ];    }),]);  

Laravel 微风 API 和 Next.js

Laravel Breeze API 脚手架和 Next.js 入门工具包由Taylor Otwell和Miguel Piedrafita 贡献。

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

改进的点火异常页面

点火由Spatie开发。

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

改进route:list的 CLI 输出

Nuno Maduro贡献了改进 route:list 的 CLI 输出

route:list Laravel 9.x 版本的CLI 输出得到了显着改进,在探索你的路由定义时提供了一种美妙的新体验。

test使用 Artisan命令测试覆盖率

使用 Artisan test 命令时的测试覆盖率由Nuno Maduro 提供。

Artisan test 命令收到了一个新 –coverage 选项,您可以使用该选项来探索您的测试为您的应用程序提供的代码覆盖率:

 php artisan test --coverage  

测试覆盖率结果将直接显示在 CLI 输出中。

此外,如果您想指定测试覆盖率必须满足的最低阈值,您可以使用该 –min 选项。如果未达到给定的最小阈值,则测试套件将失败:

 php artisan test --coverage --min=80.3  

套接字回声服务器

Soketi Echo 服务器由Alex Renoki 开发。

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

有关使用 Soketi 的更多信息,请参阅广播文档和Soketi 文档。

改进的集合 IDE 支持

Nuno Maduro贡献了改进的集合 IDE 支持

Laravel 9.x 为集合组件添加了改进的“通用”样式类型定义,改进了 IDE 和静态分析支持。 PHPStorm 等 IDE或PHPStan等静态分析工具现在可以更好地理解 Laravel 集合。

新助手

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

str

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

 $string = str('Taylor')->append(' Otwell'); // 'Taylor Otwell'  

如果没有为 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']);  
收藏
分享
海报
0 条评论
167
上一篇:现在还有棚户区改造吗(2020棚户区改造叫停后房价会降吗) 下一篇:悟空浏览器邀请好友有上限吗(悟空浏览器邀请一个好友多少钱)

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码