Laravel 8 正式釋出!來看看有哪些新特性

前端貓哥發表於2020-09-09

Laravel 8 延續了 7 中的改進,包括 Laravel Jetstream,模型工廠類,遷移壓縮,任務批處理,速率控制優化,佇列優化,動態 Blade 組建,Tailwind 分頁檢視,時間測試助手,artisan serve 伺服器優化,事件監聽器優化,以及其他各種 BUG 修復和可用性改進。

Laravel Jetstream 來自於 Laravel 之父 Taylor Otwell。它是一個設計的非常漂亮的 Laravel 應用程式腳手架。Laravel Jetstream 為你搭建你的下一個專案提供了一個完美的起點,它包含了:登入,註冊,郵箱驗證,雙因素認證,會話管理,基於 Laravel Sanctum 的 API 管理,可選的團隊管理。Laravel Jetstream 替代並改進了之前版本的認證 UI 腳手架。

Laravel Jetstream 是使用 Tailwind CSS 設計的,並提供 Livewire 和 Inertia 腳手架供選擇。

由於大量的社群需求,預設的 Laravel 框架現在包含一個 app/Models 目錄,我們希望你喜歡這個為你的模型檔案準備的新家。所有相關的生成器命令都已經更新,假定你的模型檔案存放在 app/Models 目錄,當然前提是存在這個目錄。如果不存在這個目錄,框架會假定你的模型檔案存在於 app 目錄下。

模型工廠類由 Taylor Otwell 貢獻。

Elequent 模型工廠已經被完全重寫為基於類的工廠,並進行了改進,以完美支援模型關聯。例如,包含在 Laravel 中的 UserFactory 是這樣寫的:

<?php

namespace Database\Factories;

use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
use Illuminate\Support\Str;

class UserFactory extends Factory
{
    /**
     * The name of the factory's corresponding model.
     *
     * @var string
     */
    protected $model = User::class;

    /**
     * Define the model's default state.
     *
     * @return array
     */
    public function definition()
    {
        return [
            'name' => $this->faker->name,
            'email' => $this->faker->unique()->safeEmail,
            'email_verified_at' => now(),
            'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password
            'remember_token' => Str::random(10),
        ];
    }
}

因為生成的模型上提供了新的 HasFactory trait,模型工廠可以這樣使用:

use App\Models\User;

User::factory()->count(50)->create();

因為模型工廠現在是簡單的 PHP 類,狀態轉換可以寫成類方法。除此之外,你也可以給你的Elequent 模型工廠新增任意你需要的工具類。

例如,你的 User 模型可能有個屬性值需要修改為 suspended,你可以使用工廠的 state 方法來定義這個狀態轉移。你可以隨意命名你的方法,畢竟這就是一個典型的 PHP 方法。

/**
 * Indicate that the user is suspended.
 *
 * @return \Illuminate\Database\Eloquent\Factories\Factory
 */
public function suspended()
{
    return $this->state([
        'account_status' => 'suspended',
    ]);
}

定製好狀態轉移方法後,我們就可以這麼使用:

use App\Models\User;  

User::factory()->count(5)->suspended()->create(); 

像之前說到的,Laravel 8 的模型工廠包含了對模型關聯的完美支援。現在假定我們的 User 模型有一個 Posts 關聯方法,我們只需要執行下面的程式碼就可以生成一個有 3 篇文章的使用者。

$users = User::factory()
            ->hasPosts(3, [
                'published' => false,
            ])
            ->create();

為了簡化升級過程,我們釋出了一個 laravel/legacy-factories 擴充套件包,可以在Laravel 8中支援以前的模型工廠。

重寫版的模型工廠還包含了很多特性,我們相信你會喜歡的。想了解更多的話,請檢視文件 learnku.com/docs/laravel/8.x/datab...

遷移壓縮由Taylor Otwell 貢獻。

在你開發應用的過程中,隨著時間的推移,你的遷移檔案可能會累積的越來越多,導致你的遷移目錄變得非常臃腫。現在,如果你願意的話,你可以把你的遷移檔案壓縮成一個 SQL 檔案。執行 schema:dump 即可:

php artisan schema:dump

// Dump the current database schema and prune all existing migrations...
php artisan schema:dump --prune

執行完這條命令,Laravel 將會在你的 database/schema 目錄寫入一個 “schema” 檔案。現在,當你執行資料庫遷移時,Laravel 將會先執行 schema 檔案中的 SQL,再執行不包含在 schema 中的剩餘遷移。

任務批處理由 Taylor Otwell 和 Mohamed Said 共同貢獻。

Laravel 的任務批處理特性讓你可以簡單地執行批量任務,然後在批量任務執行完成後再執行一些操作。

Bus facade 中新增了一個 batch 方法可以用來執行批量任務,當然,批處理主要是和回撥結合使用的。所以。你可能需要使用 then,catch,finally 方法來定義完整的回撥。這三種回撥任意一個被呼叫時都會接收到一個 Illuminate\Bus\Batch 例項。

use App\Jobs\ProcessPodcast;
use App\Podcast;
use Illuminate\Bus\Batch;
use Illuminate\Support\Facades\Batch;
use Throwable;

$batch = Bus::batch([
    new ProcessPodcast(Podcast::find(1)),
    new ProcessPodcast(Podcast::find(2)),
    new ProcessPodcast(Podcast::find(3)),
    new ProcessPodcast(Podcast::find(4)),
    new ProcessPodcast(Podcast::find(5)),
])->then(function (Batch $batch) {

})->catch(function (Batch $batch, Throwable $e) {

})->finally(function (Batch $batch) {

})->dispatch();

return $batch->id;

想了解更多關於批處理,請訪問文件 learnku.com/docs/laravel/8.x/queue...

速率限制優化由 Taylor Otwell 貢獻。

Laravel的請求速率限制器特性得到了增強,具有更好的靈活性和更強大的功能,同時相容上一個版本的 throttle 中介軟體。

使用 RateLimiter facade 的 for 方法來定義一個速率限制器。for 方法第一個引數是速率限制器名稱,第二個引數是一個閉包函式,閉包函式返回速率限制器的配置。

use Illuminate\Cache\RateLimiting\Limit;
use Illuminate\Support\Facades\RateLimiter;

RateLimiter::for('global', function (Request $request) {
    return Limit::perMinute(1000);
});

因為速率限制器的回撥接收到的是一個 HTTP 請求例項,你可以基於請求或當前認證的使用者來動態設定速率限制。

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100);
});

有時你可能希望根據一些特定的值來進行速率限制。比如你希望限制i使用者每分鐘內每個IP地址最多發起100次請求,使用 by 方法來實現這一功能;

RateLimiter::for('uploads', function (Request $request) {
    return $request->user()->vipCustomer()
                ? Limit::none()
                : Limit::perMinute(100)->by($request->ip());
});

使用 throttle 中介軟體將剛剛建立的速率限制器繫結到路由或者路由組就可以了。將你設定的速率限制器名稱傳入中介軟體來指定使用哪個速率限制器:

Route::middleware(['throttle:uploads'])->group(function () {
    Route::post('/audio', function () {

    });

    Route::post('/video', function () {

    });
});

想了解更多關於速率限制器,請檢視文件:learnku.com/docs/laravel/8.x/routi...

維護模式優化由 Taylor Otwell 貢獻,靈感來源於 Spatie

在之前的 Laravel 版本中,php artisan down 開啟的維護模式可以通過建立一個 IP 地址白名單來繞過,在白名單中的 IP 地址可以正常訪問應用。在新版本中這個特性被移除了,取而代之的是一個簡單的 token 方案。

在維護模式下,你可以通過 secret 選項生成一個可以繞過維護模式的 token:

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

將應用設定為維護模式後,你可以帶上這個 token 訪問應用程式的 URL,然後 Laravel 將會在瀏覽器中寫入一個能繞過維護模式的 cookie:

https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515

通過這個隱藏路由,你會被重定向到應用的 / 路由。一旦 cookie 被寫入瀏覽器,你就可以像沒開啟維護模式一樣正常的訪問應用。

如果你在部署期間使用了 php artisan down,你的使用者又在更新 composer 依賴或其他基礎檢視時訪問應用,可能偶爾還是會出錯。出現這種情況是因為 Laravel 必須啟動先啟動一些核心的功能,來確定你的應用是否處於維護模式,然後用模板引擎渲染維護模式檢視。

由於這個原因,Laravel 現在允許你在請求的生命週期的最開始預渲染一個維護模式檢視。這個檢視會在應用的任何依賴載入之前渲染。你可以使用 down 命令的 render 選項選擇一個預渲染模板:

php artisan down --render="errors::503"

Catch 優化由 Mohamed said 貢獻。

使用新增的 catch 方法,你現在可以規定一個閉包函式來監聽某個閉包佇列。當閉包佇列耗盡了佇列配置的所有重置次數後還沒有完全成功,就執行閉包函式:

use Throwable;

dispatch(function () use ($podcast) {
    $podcast->publish();
})->catch(function (Throwable $e) {

});

動態 Blade 元件由 Taylor Otwell 貢獻。

有時你需要渲染一個元件,但是不確定在執行時應該渲染哪個元件。在這種情況下,你現在可以使用 Laravel 內建的 dynamic-component 元件去根據執行時的某個值或某個變數來動態渲染元件:

<x-dynamic-component :component="$componentName" class="mt-4" />

想了解更多關於 Blade 元件,請檢視文件:learnku.com/docs/laravel/8.x/blade...

事件監聽器優化由 Taylor Otwell 貢獻

現在可以通過給 Event::listen 方法傳入一個閉包函式來簡單的註冊一個基於閉包的事件監聽器。Laravel 會檢查閉包以確定監聽器處理的事件型別。

use App\Events\PodcastProcessed;
use Illuminate\Support\Facades\Event;

Event::listen(function (PodcastProcessed $event) {

});

除此之外,基於閉包的事件監聽器現在可以使用 Illuminate\Events\queueable 方法標記為可佇列化的:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;

Event::listen(queueable(function (PodcastProcessed $event) {

}));

就像佇列任務一樣,你可以使用 onConnection,onQueue,和 delay 方法定製如何執行佇列監聽器:

Event::listen(queueable(function (PodcastProcessed $event) {

})->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

如果你想對匿名佇列監聽器進行異常處理,你可以在定義 queueable 監聽器時使用 catch 方法並傳入一個閉包函式來實現:

use App\Events\PodcastProcessed;
use function Illuminate\Events\queueable;
use Illuminate\Support\Facades\Event;
use Throwable;

Event::listen(queueable(function (PodcastProcessed $event) {

})->catch(function (PodcastProcessed $event, Throwable $e) {

}));

時間測試工具由 Taylor Otwell 貢獻,靈感來自於 Ruby on Rails

在測試時,你可能偶爾需要修改now 或者 Illuminate\Support\Carbon::now() 返回的時間。Laravel 的基礎測試類現在包含了一個可以操作時間的工具:

public function testTimeCanBeManipulated()
{
    $this->travel(5)->milliseconds();
    $this->travel(5)->seconds();
    $this->travel(5)->minutes();
    $this->travel(5)->hours();
    $this->travel(5)->days();
    $this->travel(5)->weeks();
    $this->travel(5)->years();

    $this->travel(-5)->hours();

    $this->travelTo(now()->subHours(6));

    $this->travelBack();
}

Artisan serve 優化由 Taylor Otwell 貢獻

現在,優化後的 Artisan serve 命令可以監聽本地 .env 檔案中的環境變數的修改,並自動重新載入。以前則必須手動重啟。

Laravel 的分頁器現在預設使用 Tailwind CSS 框架。Tailwind CSS 是一個輕量級的,高度可定製的CSS 框架,它提供了構建一個定製化設計所需要的所有模組,並且沒有煩人的不得不覆蓋掉的樣式。當然了,你仍然可以選擇使用 Bootstrap 3 或 4。


以上就是 Laravel 8 帶來的新特性簡介!下面附上相關連結:

Laravel 8 正式釋出:laravel-news.com/laravel8

Laravel 8 官方文件:《Laravel 8 中文文件》

Laravel 8 中文文件:《Laravel 8 中文文件》

我的部落格:dmmylove.cn/articles/63

我的公眾號:前端貓哥

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章