看看 Laravel 9 的新功能

Laravel v9 將是 Laravel 的下一個(gè) LTS 版本,它將在 2022 年 2 月的某個(gè)時(shí)間發(fā)布。在這篇文章中,我們想概述迄今為止宣布的所有新功能和更改。
Laravel 9 發(fā)布日期變更
Laravel v9 原定于今年 9 月左右發(fā)布,但 Laravel 團(tuán)隊(duì)決定將此版本推遲到 2022 年 2 月:
Laravel 使用各種社區(qū)驅(qū)動(dòng)的包以及九個(gè) Symfony 組件來(lái)實(shí)現(xiàn)框架內(nèi)的許多功能。Symfony 6.0 將于 11 月發(fā)布。出于這個(gè)原因,我們選擇將 Laravel 9.0 的發(fā)布推遲到 2022
年。通過(guò)推遲發(fā)布,我們可以將底層的 Symfony 組件升級(jí)到 Symfony 6.0,而不必被迫等到 2022 年 9 月才能執(zhí)行此升級(jí)。此外,這更好地為我們未來(lái)的發(fā)布做好了準(zhǔn)備,因?yàn)槲覀兊哪甓劝l(fā)布總是在 Symfony 發(fā)布后兩個(gè)月發(fā)布。
這也將推動(dòng)未來(lái)的主要版本,以下是未來(lái)的時(shí)間表:
Laravel 9:2022 年 2 月 8 日
Laravel 10:2023 年 2 月 7 日
PHP 8 將成為 Laravel 9 中的最低版本
由于 Laravel 9 需要 Symfony 6.0 并且它的最低要求是 PHP 8,這意味著 Laravel 9 將具有同樣的限制。
新的路由列表設(shè)計(jì)
該routes:list命令已經(jīng)包含在 Laravel 中很長(zhǎng)時(shí)間了,有時(shí)會(huì)出現(xiàn)的一個(gè)問(wèn)題是,如果您定義了龐大而復(fù)雜的路由,則嘗試在控制臺(tái)中查看它們可能會(huì)變得混亂。多虧了Nuno Maduro 的 PR,讓路由列表有了新的設(shè)計(jì)。

新的測(cè)試覆蓋選項(xiàng)
一個(gè)新artisan test --coverage選項(xiàng)將直接在終端上顯示測(cè)試覆蓋率。它還包括一個(gè)--min選項(xiàng),您可以使用該選項(xiàng)來(lái)指示測(cè)試覆蓋率的最低閾值強(qiáng)制執(zhí)行。

匿名的數(shù)據(jù)庫(kù)遷移類(lèi)
今年早些時(shí)候,Laravel 8.37 推出了一個(gè)名為Anonymous Migrations的新功能,可以防止遷移類(lèi)名稱(chēng)沖突。
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();
});
}
};當(dāng) Laravel 9 發(fā)布時(shí),這將是你運(yùn)行?php artisan make:migration 時(shí)的默認(rèn)設(shè)置 。
新的查詢構(gòu)造器
感謝 Chris Morrell,Laravel 9 將提供一個(gè)新的 Query Builder 界面,你可以看到這個(gè)合并的 PR以了解所有細(xì)節(jié)。
對(duì)于在 IDE 中依賴類(lèi)型提示進(jìn)行靜態(tài)分析、重構(gòu)或代碼完成的開(kāi)發(fā)人員來(lái)說(shuō),缺乏共享接口或 IDE 之間的繼承可能Query\Builder會(huì)非常棘手: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
});此功能添加了一個(gè)新的?Illuminate\Contracts\Database\QueryBuilder?接口和一個(gè)?Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder?實(shí)現(xiàn)該接口以代替現(xiàn)有?__call?實(shí)現(xiàn)的特征。
PHP 8 字符串函數(shù)
由于 PHP 8 將是最低要求,Tom Schlick 提交了一個(gè)PR以在類(lèi)內(nèi)部使用str_contains(),str_starts_with()和str_ends_with()函數(shù)。\Illuminate\Support\Str
從 SwiftMailer 到 Symfony Mailer
Symfony Mailer 的支持由Dries Vints、James Brooks和Julius Kiekbusch 提供。
以前的 Laravel 版本使用Swift Mailer庫(kù)來(lái)發(fā)送外發(fā)電子郵件。但是,該庫(kù)不再維護(hù),并由 Symfony Mailer 接替。
請(qǐng)查看升級(jí)指南以了解有關(guān)確保您的應(yīng)用程序與 Symfony Mailer 兼容的更多信息。
Flysystem 3.x
Flysystem 3.x 支持由Dries Vints 提供。
Laravel 9.x 將我們上游的 Flysystem 依賴升級(jí)到 Flysystem 3.x。Flysystem 為Storage外觀提供的所有文件系統(tǒng)交互提供支持。
改進(jìn)的 Eloquent Accessors / Mutators
Taylor Otwell貢獻(xiàn)了改進(jìn)的 Eloquent 訪問(wèn)器/修改器。
Laravel 9.x 提供了一種定義 Eloquent訪問(wèn)器和修改器的新方法。在之前的 Laravel 版本中,定義訪問(wèn)器和修改器的唯一方法是在模型上定義前綴方法,如下所示:
public function getNameAttribute($value)
{
return strtoupper($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}但是,在 Laravel 9.x 中,您可以使用單個(gè)非前綴方法通過(guò)類(lèi)型提示返回類(lèi)型來(lái)定義訪問(wèn)器和修改器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,
);
}此外,這種定義訪問(wèn)器的新方法將緩存屬性返回的對(duì)象值,就像自定義轉(zhuǎn)換類(lèi)一樣:
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貢獻(xiàn)。
PHP 8.1 引入了對(duì)Enums的支持。Laravel 9.x 引入了在路由定義中鍵入提示 Enum 的能力,并且 Laravel 只會(huì)在該路由段是 URI 中的有效 Enum 值時(shí)調(diào)用該路由。否則,將自動(dòng)返回 HTTP 404 響應(yīng)。例如,給定以下枚舉:
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}{category}您可以定義僅當(dāng)路由段為fruits或時(shí)才會(huì)調(diào)用的路由people。否則,將返回 HTTP 404 響應(yīng):
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});控制器路由組
路由組改進(jìn)由Luke Downing貢獻(xiàn)。
您現(xiàn)在可以使用該controller方法為組內(nèi)的所有路由定義公共控制器。然后,在定義路由時(shí),您只需要提供它們調(diào)用的控制器方法:
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});Enum Eloquent 屬性轉(zhuǎn)換
枚舉轉(zhuǎn)換僅適用于 PHP 8.1+。
枚舉鑄造由Mohamed Said貢獻(xiàn)。
Eloquent 現(xiàn)在允許您將屬性值轉(zhuǎn)換為 PHP 枚舉。為此,您可以在模型的$casts屬性數(shù)組中指定要強(qiáng)制轉(zhuǎn)換的屬性和枚舉:
use App\Enums\ServerStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => ServerStatus::class,
];一旦你在你的模型上定義了轉(zhuǎn)換,當(dāng)你與屬性交互時(shí),指定的屬性將自動(dòng)轉(zhuǎn)換為枚舉:
if ($server->status == ServerStatus::provisioned) {
$server->status = ServerStatus::ready;
$server->save();
}強(qiáng)制范圍綁定
強(qiáng)制范圍綁定由Claudio Dekker貢獻(xiàn)。
在之前的 Laravel 版本中,您可能希望在路由定義中限定第二個(gè) Eloquent 模型,使其必須是之前 Eloquent 模型的子模型。例如,考慮這個(gè)通過(guò) slug 為特定用戶檢索博客文章的路由定義:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});當(dāng)使用自定義鍵控隱式綁定作為嵌套路由參數(shù)時(shí),Laravel 將自動(dòng)限定查詢范圍以通過(guò)其父級(jí)檢索嵌套模型,使用約定來(lái)猜測(cè)父級(jí)上的關(guān)系名稱(chēng)。但是,當(dāng)自定義鍵用于子路由綁定時(shí),Laravel 之前僅支持此行為。
但是,在 Laravel 9.x 中,即使沒(méi)有提供自定義鍵,您現(xiàn)在也可以指示 Laravel 限定“子”綁定的范圍。為此,您可以scopeBindings在定義路由時(shí)調(diào)用該方法:
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();或者,您可以指示整個(gè)路由定義組使用范圍綁定:
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 入門(mén)套件由Taylor Otwell和Miguel Piedrafita貢獻(xiàn)。
Laravel Breeze 入門(mén)套件已經(jīng)獲得了“API”腳手架模式和免費(fèi)的 Next.js?前端實(shí)現(xiàn)。這個(gè)初學(xué)者工具包腳手架可用于快速啟動(dòng)用作后端的 Laravel 應(yīng)用程序,以及用于 JavaScript 前端的 Laravel Sanctum 認(rèn)證 API。
Laravel Scout 數(shù)據(jù)庫(kù)引擎
Laravel Scout 數(shù)據(jù)庫(kù)引擎由Taylor Otwell和Dries Vints 貢獻(xiàn)。
如果您的應(yīng)用程序與中小型數(shù)據(jù)庫(kù)交互或工作負(fù)載較輕,您現(xiàn)在可以使用 Scout 的“數(shù)據(jù)庫(kù)”引擎,而不是 Algolia 或 MeiliSerach 等專(zhuān)用搜索服務(wù)。數(shù)據(jù)庫(kù)引擎將在過(guò)濾現(xiàn)有數(shù)據(jù)庫(kù)的結(jié)果時(shí)使用“where like”子句和全文索引,以確定查詢的適用搜索結(jié)果。
全文索引 / Where?語(yǔ)句
全文索引和“where”子句由Taylor Otwell和Dries Vints 提供。
當(dāng)使用 MySQL 或 PostgreSQL 時(shí),該fullText方法現(xiàn)在可以添加到列定義中以生成全文索引:
$table->text('bio')->fullText();此外,whereFullTextandorWhereFullText方法可用于將全文“where”子句添加到具有全文索引的列的查詢中。這些方法將被 Laravel 轉(zhuǎn)換成適合底層數(shù)據(jù)庫(kù)系統(tǒng)的 SQL。例如,MATCH AGAINST將為使用 MySQL 的應(yīng)用程序生成一個(gè)子句:
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();渲染內(nèi)聯(lián) Blade 模板
有時(shí)您可能需要將原始 Blade 模板字符串轉(zhuǎn)換為有效的 HTML。您可以使用外觀render提供的方法來(lái)完成此操作。Blade該render方法接受 Blade 模板字符串和提供給模板的可選數(shù)據(jù)數(shù)組:
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);Soketi Echo 服務(wù)器
Soketi Echo 服務(wù)器由Alex Renoki開(kāi)發(fā)。
雖然不是 Laravel 9.x 獨(dú)有的,但 Laravel 最近協(xié)助編寫(xiě)了 Soketi 的文檔,這是一個(gè)為 Node.js 編寫(xiě)的與Laravel Echo兼容的 Web Socket 服務(wù)器。Soketi 為那些喜歡管理自己的 Web Socket 服務(wù)器的應(yīng)用程序提供了一個(gè)很好的、開(kāi)源的替代 Pusher 和 Ably。
Bootstrap 5 分頁(yè)視圖
Laravel 現(xiàn)在包含使用Bootstrap 5構(gòu)建的分頁(yè)視圖。要使用這些視圖而不是默認(rèn)的 Tailwind 視圖,您可以在類(lèi)的方法中調(diào)用分頁(yè)器的useBootstrapFive方法:bootApp\Providers\AppServiceProvider
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}改進(jìn)的 Ignition 異常頁(yè)面
Spatie 創(chuàng)建的開(kāi)源異常調(diào)試頁(yè)面 Ignition 已經(jīng)從頭開(kāi)始重新設(shè)計(jì)。新的、改進(jìn)的 Ignition 隨 Laravel 9.x 一起提供,包括淺色/深色主題、可定制的“在編輯器中打開(kāi)”功能等等。
新的助手函數(shù)
Laravel 9.x 引入了兩個(gè)新的、方便的輔助函數(shù),你可以在自己的應(yīng)用程序中使用它們。
str()
該str函數(shù)返回Illuminate\Support\Stringable給定字符串的新實(shí)例。這個(gè)函數(shù)等價(jià)于Str::of方法:
$string = str('Ning')->append(' Zelin');
// 'Ning Zelin'如果沒(méi)有為str函數(shù)提供參數(shù),則函數(shù)返回 的實(shí)例Illuminate\Support\Str:
$snake = str()->snake('LaravelFramework');
// 'laravel_framework'to_route()
該to_route函數(shù)為給定的命名路由生成重定向 HTTP 響應(yīng),提供了一種從路由和控制器重定向到命名路由的表達(dá)方式:
return to_route('users.show', ['user' => 1]);如有必要,您可以將應(yīng)分配給重定向的 HTTP 狀態(tài)代碼和任何其他響應(yīng)標(biāo)頭作為第三個(gè)和第四個(gè)參數(shù)傳遞給 to_route 方法:
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);server.php 文件可以刪除
一個(gè)次要功能,但您現(xiàn)在可以server.php從項(xiàng)目中刪除該文件,它將包含在框架中。此文件僅用于php artisan serve.
其他...
Laravel 9 還需要幾天的時(shí)間,更多的新功能和公告將會(huì)發(fā)布。
