跳到主要內容

Laravel Pulse

📝 此頁面為 Laravel 官方文檔的繁體中文翻譯。查看原始英文版本

Laravel Pulse

簡介

Laravel Pulse 提供了應用程式效能和使用情況的即時洞察。使用 Pulse,您可以追蹤緩慢的任務和端點等瓶頸,找到最活躍的使用者等。

如需對個別事件進行深入除錯,請查看 Laravel Telescope

安裝

[!WARNING] Pulse 的第一方儲存實作目前需要 MySQL、MariaDB 或 PostgreSQL 資料庫。如果您使用不同的資料庫引擎,則需要一個獨立的 MySQL、MariaDB 或 PostgreSQL 資料庫來存放 Pulse 資料。

您可以使用 Composer 套件管理器安裝 Pulse:

composer require laravel/pulse

接著,您應該使用 vendor:publish Artisan 命令發佈 Pulse 的配置和遷移檔案:

php artisan vendor:publish --provider="Laravel\Pulse\PulseServiceProvider"

最後,您應該執行 migrate 命令來建立儲存 Pulse 資料所需的資料表:

php artisan migrate

Pulse 的資料庫遷移執行完畢後,您可以透過 /pulse 路由存取 Pulse 儀表板。

[!NOTE] 如果您不想將 Pulse 資料儲存在應用程式的主資料庫中,可以指定專用的資料庫連線

配置

Pulse 的許多配置選項可以透過環境變數控制。要查看可用的選項、註冊新的記錄器或配置進階選項,您可以發佈 config/pulse.php 配置檔案:

php artisan vendor:publish --tag=pulse-config

儀表板

授權

Pulse 儀表板可以透過 /pulse 路由存取。預設情況下,您只能在 local 環境中存取此儀表板,因此您需要透過自訂 'viewPulse' 授權閘道來為生產環境配置授權。您可以在應用程式的 app/Providers/AppServiceProvider.php 檔案中完成此操作:

use App\Models\User;
use Illuminate\Support\Facades\Gate;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Gate::define('viewPulse', function (User $user) {
        return $user->isAdmin();
    });

    // ...
}

自訂

Pulse 儀表板的卡片和佈局可以透過發佈儀表板檢視來配置。儀表板檢視將被發佈到 resources/views/vendor/pulse/dashboard.blade.php

php artisan vendor:publish --tag=pulse-dashboard

儀表板由 Livewire 驅動,允許您自訂卡片和佈局,而無需重建任何 JavaScript 資源。

在此檔案中,<x-pulse> 元件負責渲染儀表板,並為卡片提供網格佈局。如果您希望儀表板跨越螢幕的完整寬度,可以為元件提供 full-width 屬性:

<x-pulse full-width>
    ...
</x-pulse>

預設情況下,<x-pulse> 元件將建立 12 列網格,但您可以使用 cols 屬性來自訂:

<x-pulse cols="16">
    ...
</x-pulse>

每張卡片接受 colsrows 屬性來控制空間和定位:

<livewire:pulse.usage cols="4" rows="2" />

大多數卡片還接受 expand 屬性來顯示完整卡片而不是滾動:

<livewire:pulse.slow-queries expand />

解析使用者

對於顯示使用者資訊的卡片(例如應用程式使用情況卡片),Pulse 只會記錄使用者的 ID。在渲染儀表板時,Pulse 將從預設的 Authenticatable 模型中解析 nameemail 欄位,並使用 Gravatar 網路服務顯示頭像。

您可以透過在應用程式的 App\Providers\AppServiceProvider 類別中呼叫 Pulse::user 方法來自訂欄位和頭像。

user 方法接受一個閉包,該閉包將接收要顯示的 Authenticatable 模型,並應返回包含使用者 nameextraavatar 資訊的陣列:

use Laravel\Pulse\Facades\Pulse;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Pulse::user(fn ($user) => [
        'name' => $user->name,
        'extra' => $user->email,
        'avatar' => $user->avatar_url,
    ]);

    // ...
}

[!NOTE] 您可以透過實作 Laravel\Pulse\Contracts\ResolvesUsers 合約並在 Laravel 的服務容器中綁定它,來自訂如何捕獲和檢索已認證使用者。

卡片

伺服器

<livewire:pulse.servers /> 卡片顯示所有執行 pulse:check 命令的伺服器的系統資源使用情況。請參閱關於伺服器記錄器的文件以了解更多關於系統資源報告的資訊。

如果您在基礎架構中更換了伺服器,您可能希望在給定時間後停止在 Pulse 儀表板中顯示不活躍的伺服器。您可以透過 ignore-after 屬性來實現,該屬性接受不活躍伺服器應從 Pulse 儀表板中移除的秒數。或者,您可以提供相對時間格式的字串,例如 1 hour3 days and 1 hour

<livewire:pulse.servers ignore-after="3 hours" />

應用程式使用情況

<livewire:pulse.usage /> 卡片顯示向應用程式發出請求、分發任務以及遇到緩慢請求的前 10 名使用者。

如果您希望同時在螢幕上查看所有使用指標,可以多次包含該卡片並指定 type 屬性:

<livewire:pulse.usage type="requests" />
<livewire:pulse.usage type="slow_requests" />
<livewire:pulse.usage type="jobs" />

要了解如何自訂 Pulse 檢索和顯示使用者資訊,請查閱我們關於解析使用者的文件。

[!NOTE] 如果您的應用程式收到大量請求或分發大量任務,您可能希望啟用採樣。請參閱使用者請求記錄器使用者任務記錄器緩慢任務記錄器文件以了解更多資訊。

例外

<livewire:pulse.exceptions /> 卡片顯示應用程式中發生的例外的頻率和最近性。預設情況下,例外會根據例外類別和發生的位置進行分組。請參閱例外記錄器文件以了解更多資訊。

佇列

<livewire:pulse.queues /> 卡片顯示應用程式中佇列的吞吐量,包括已排隊、處理中、已處理、已釋放和失敗的任務數量。請參閱佇列記錄器文件以了解更多資訊。

緩慢請求

<livewire:pulse.slow-requests /> 卡片顯示超過配置閾值(預設為 1000ms)的傳入請求。請參閱緩慢請求記錄器文件以了解更多資訊。

緩慢任務

<livewire:pulse.slow-jobs /> 卡片顯示應用程式中超過配置閾值(預設為 1000ms)的佇列任務。請參閱緩慢任務記錄器文件以了解更多資訊。

緩慢查詢

<livewire:pulse.slow-queries /> 卡片顯示應用程式中超過配置閾值(預設為 1000ms)的資料庫查詢。

預設情況下,緩慢查詢會根據 SQL 查詢(不含綁定)和發生的位置進行分組,但如果您希望僅根據 SQL 查詢進行分組,可以選擇不捕獲位置。

如果您因極大的 SQL 查詢收到語法反白而遇到渲染效能問題,可以透過新增 without-highlighting 屬性來停用反白:

<livewire:pulse.slow-queries without-highlighting />

請參閱緩慢查詢記錄器文件以了解更多資訊。

緩慢對外請求

<livewire:pulse.slow-outgoing-requests /> 卡片顯示使用 Laravel 的 HTTP 客戶端進行的對外請求,這些請求超過了配置閾值(預設為 1000ms)。

預設情況下,條目會根據完整 URL 進行分組。但是,您可能希望使用正規表示式來標準化或分組類似的對外請求。請參閱緩慢對外請求記錄器文件以了解更多資訊。

快取

<livewire:pulse.cache /> 卡片顯示應用程式的快取命中與未命中統計資料,包括全域和個別金鑰。

預設情況下,條目會根據金鑰進行分組。但是,您可能希望使用正規表示式來標準化或分組類似的金鑰。請參閱快取互動記錄器文件以了解更多資訊。

捕獲資料

大多數 Pulse 記錄器會根據 Laravel 分發的框架事件自動捕獲資料。但是,伺服器記錄器和某些第三方卡片必須定期輪詢資訊。要使用這些卡片,您必須在所有個別應用程式伺服器上執行 pulse:check 守護程序:

php artisan pulse:check

[!NOTE] 要讓 pulse:check 程序永久在背景執行,您應該使用 Supervisor 等程序監視器來確保命令不會停止執行。

由於 pulse:check 命令是一個長時間執行的程序,它在不重新啟動的情況下將不會看到程式碼庫的變更。您應該在應用程式的部署過程中透過呼叫 pulse:restart 命令來優雅地重新啟動該命令:

php artisan pulse:restart

[!NOTE] Pulse 使用快取來儲存重新啟動訊號,因此在您使用此功能之前,應確認已為您的應用程式正確配置了快取驅動程式。

記錄器

記錄器負責從您的應用程式捕獲要記錄在 Pulse 資料庫中的資料。記錄器在 Pulse 配置檔案recorders 部分中註冊和配置。

快取互動

CacheInteractions 記錄器捕獲應用程式中發生的快取命中與未命中的資訊,用於在快取卡片上顯示。

您可以選擇調整採樣率和忽略的金鑰模式。

您還可以配置金鑰分組,以便將類似的金鑰分組為單一條目。例如,您可能希望從快取相同類型資訊的金鑰中移除唯一 ID。分組是使用正規表示式來「尋找並取代」金鑰的部分。配置檔案中包含一個範例:

Recorders\CacheInteractions::class => [
    // ...
    'groups' => [
        // '/:\d+/' => ':*',
    ],
],

第一個匹配的模式將被使用。如果沒有模式匹配,則金鑰將按原樣捕獲。

例外

Exceptions 記錄器捕獲應用程式中發生的可報告例外的資訊,用於在例外卡片上顯示。

您可以選擇調整採樣率和忽略的例外模式。您還可以配置是否捕獲例外發生的位置。捕獲的位置將顯示在 Pulse 儀表板上,有助於追蹤例外來源;但是,如果相同的例外發生在多個位置,則每個唯一位置都會出現多次。

佇列

Queues 記錄器捕獲應用程式佇列的資訊,用於在佇列卡片上顯示。

您可以選擇調整採樣率和忽略的任務模式。

緩慢任務

SlowJobs 記錄器捕獲應用程式中發生的緩慢任務的資訊,用於在緩慢任務卡片上顯示。

您可以選擇調整緩慢任務閾值、採樣率和忽略的任務模式。

您可能有一些預期比其他任務需要更長時間的任務。在這種情況下,您可以配置每個任務的閾值:

Recorders\SlowJobs::class => [
    // ...
    'threshold' => [
        '#^App\\Jobs\\GenerateYearlyReports$#' => 5000,
        'default' => env('PULSE_SLOW_JOBS_THRESHOLD', 1000),
    ],
],

如果沒有正規表示式模式匹配任務的類別名稱,則將使用 'default' 值。

緩慢對外請求

SlowOutgoingRequests 記錄器捕獲使用 Laravel 的 HTTP 客戶端進行的對外 HTTP 請求的資訊,這些請求超過了配置閾值,用於在緩慢對外請求卡片上顯示。

您可以選擇調整緩慢對外請求閾值、採樣率和忽略的 URL 模式。

您可能有一些預期比其他請求需要更長時間的對外請求。在這種情況下,您可以配置每個請求的閾值:

Recorders\SlowOutgoingRequests::class => [
    // ...
    'threshold' => [
        '#backup.zip$#' => 5000,
        'default' => env('PULSE_SLOW_OUTGOING_REQUESTS_THRESHOLD', 1000),
    ],
],

如果沒有正規表示式模式匹配請求的 URL,則將使用 'default' 值。

您還可以配置 URL 分組,以便將類似的 URL 分組為單一條目。例如,您可能希望從 URL 路徑中移除唯一 ID 或僅按網域分組。分組是使用正規表示式來「尋找並取代」URL 的部分。配置檔案中包含一些範例:

Recorders\SlowOutgoingRequests::class => [
    // ...
    'groups' => [
        // '#^https://api\.github\.com/repos/.*$#' => 'api.github.com/repos/*',
        // '#^https?://([^/]*).*$#' => '\1',
        // '#/\d+#' => '/*',
    ],
],

第一個匹配的模式將被使用。如果沒有模式匹配,則 URL 將按原樣捕獲。

緩慢查詢

SlowQueries 記錄器捕獲應用程式中超過配置閾值的任何資料庫查詢,用於在緩慢查詢卡片上顯示。

您可以選擇調整緩慢查詢閾值、採樣率和忽略的查詢模式。您還可以配置是否捕獲查詢位置。捕獲的位置將顯示在 Pulse 儀表板上,有助於追蹤查詢來源;但是,如果相同的查詢在多個位置發出,則每個唯一位置都會出現多次。

您可能有一些預期比其他查詢需要更長時間的查詢。在這種情況下,您可以配置每個查詢的閾值:

Recorders\SlowQueries::class => [
    // ...
    'threshold' => [
        '#^insert into `yearly_reports`#' => 5000,
        'default' => env('PULSE_SLOW_QUERIES_THRESHOLD', 1000),
    ],
],

如果沒有正規表示式模式匹配查詢的 SQL,則將使用 'default' 值。

緩慢請求

Requests 記錄器捕獲對應用程式的請求資訊,用於在緩慢請求應用程式使用情況卡片上顯示。

您可以選擇調整緩慢路由閾值、採樣率和忽略的路徑。

您可能有一些預期比其他請求需要更長時間的請求。在這種情況下,您可以配置每個請求的閾值:

Recorders\SlowRequests::class => [
    // ...
    'threshold' => [
        '#^/admin/#' => 5000,
        'default' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
    ],
],

如果沒有正規表示式模式匹配請求的 URL,則將使用 'default' 值。

伺服器

Servers 記錄器捕獲為應用程式提供服務的伺服器的 CPU、記憶體和儲存使用情況,用於在伺服器卡片上顯示。此記錄器需要在您要監控的每個伺服器上執行 pulse:check 命令

每個報告伺服器必須有一個唯一的名稱。預設情況下,Pulse 將使用 PHP 的 gethostname 函數返回的值。如果您想自訂此名稱,可以設定 PULSE_SERVER_NAME 環境變數:

PULSE_SERVER_NAME=load-balancer

Pulse 配置檔案還允許您自訂被監控的目錄。

使用者任務

UserJobs 記錄器捕獲在應用程式中分發任務的使用者資訊,用於在應用程式使用情況卡片上顯示。

您可以選擇調整採樣率和忽略的任務模式。

使用者請求

UserRequests 記錄器捕獲向應用程式發出請求的使用者資訊,用於在應用程式使用情況卡片上顯示。

您可以選擇調整採樣率和忽略的 URL 模式。

過濾

正如我們所見,許多記錄器提供透過配置基於條目的值(例如請求的 URL)來「忽略」傳入條目的能力。但有時根據其他因素(例如當前已認證的使用者)過濾掉記錄可能很有用。要過濾掉這些記錄,您可以將閉包傳遞給 Pulse 的 filter 方法。通常,filter 方法應在應用程式的 AppServiceProviderboot 方法中呼叫:

use Illuminate\Support\Facades\Auth;
use Laravel\Pulse\Entry;
use Laravel\Pulse\Facades\Pulse;
use Laravel\Pulse\Value;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Pulse::filter(function (Entry|Value $entry) {
        return Auth::user()->isNotAdmin();
    });

    // ...
}

效能

Pulse 被設計為可以直接插入現有應用程式,無需任何額外的基礎架構。但是,對於高流量應用程式,有幾種方法可以消除 Pulse 可能對應用程式效能造成的任何影響。

使用不同的資料庫

對於高流量應用程式,您可能更傾向使用專用的資料庫連線來處理 Pulse,以避免影響應用程式資料庫。

您可以透過設定 PULSE_DB_CONNECTION 環境變數來自訂 Pulse 使用的資料庫連線

PULSE_DB_CONNECTION=pulse

Redis 接收

[!WARNING] Redis 接收功能需要 Redis 6.2 或更高版本,並且需要 phpredispredis 作為應用程式配置的 Redis 客戶端驅動程式。

預設情況下,Pulse 會在 HTTP 回應發送給客戶端或任務處理完畢後,將條目直接儲存到配置的資料庫連線;但是,您可以使用 Pulse 的 Redis 接收驅動程式將條目發送到 Redis 串流。這可以透過配置 PULSE_INGEST_DRIVER 環境變數來啟用:

PULSE_INGEST_DRIVER=redis

預設情況下,Pulse 將使用預設的 Redis 連線,但您可以透過 PULSE_REDIS_CONNECTION 環境變數來自訂:

PULSE_REDIS_CONNECTION=pulse

[!WARNING] 使用 Redis 接收驅動程式時,您的 Pulse 安裝應始終使用與 Redis 驅動佇列不同的 Redis 連線(如果適用的話)。

使用 Redis 接收時,您需要執行 pulse:work 命令來監控串流並將條目從 Redis 移動到 Pulse 的資料庫表中。

php artisan pulse:work

[!NOTE] 要讓 pulse:work 程序永久在背景執行,您應該使用 Supervisor 等程序監視器來確保 Pulse 工作程式不會停止執行。

由於 pulse:work 命令是一個長時間執行的程序,它在不重新啟動的情況下將不會看到程式碼庫的變更。您應該在應用程式的部署過程中透過呼叫 pulse:restart 命令來優雅地重新啟動該命令:

php artisan pulse:restart

[!NOTE] Pulse 使用快取來儲存重新啟動訊號,因此在您使用此功能之前,應確認已為您的應用程式正確配置了快取驅動程式。

採樣

預設情況下,Pulse 會捕獲應用程式中發生的每個相關事件。對於高流量應用程式,這可能導致需要在儀表板中聚合數百萬個資料庫行,尤其是在較長時間範圍內。

您可以選擇在特定 Pulse 資料記錄器上啟用「採樣」。例如,將使用者請求記錄器的採樣率設定為 0.1 意味著您只記錄約 10% 的應用程式請求。在儀表板中,這些值將被放大並加上 ~ 前綴以表示它們是近似值。

一般來說,特定指標的條目越多,您就可以安全地設定較低的採樣率,而不會犧牲太多準確性。

清理

Pulse 會自動清理其儲存的條目,一旦它們超出儀表板的時間範圍。清理在接收資料時使用樂透系統進行,該系統可以在 Pulse 配置檔案中自訂。

處理 Pulse 例外

如果在捕獲 Pulse 資料時發生例外(例如無法連線到儲存資料庫),Pulse 將靜默失敗以避免影響您的應用程式。

如果您想自訂如何處理這些例外,可以為 handleExceptionsUsing 方法提供一個閉包:

use Laravel\Pulse\Facades\Pulse;
use Illuminate\Support\Facades\Log;

Pulse::handleExceptionsUsing(function ($e) {
    Log::debug('An exception happened in Pulse', [
        'message' => $e->getMessage(),
        'stack' => $e->getTraceAsString(),
    ]);
});

自訂卡片

Pulse 允許您建立自訂卡片來顯示與應用程式特定需求相關的資料。Pulse 使用 Livewire,因此在建立第一個自訂卡片之前,您可能想查閱其文件

卡片元件

在 Laravel Pulse 中建立自訂卡片首先是擴展基礎的 Card Livewire 元件並定義對應的檢視:

namespace App\Livewire\Pulse;

use Laravel\Pulse\Livewire\Card;
use Livewire\Attributes\Lazy;

#[Lazy]
class TopSellers extends Card
{
    public function render()
    {
        return view('livewire.pulse.top-sellers');
    }
}

使用 Livewire 的懶載入功能時,Card 元件將自動提供一個佔位符,該佔位符會尊重傳遞給元件的 colsrows 屬性。

在編寫 Pulse 卡片對應的檢視時,您可以利用 Pulse 的 Blade 元件來獲得一致的外觀和感覺:

<x-pulse::card :cols="$cols" :rows="$rows" :class="$class" wire:poll.5s="">
    <x-pulse::card-header name="Top Sellers">
        <x-slot:icon>
            ...
        </x-slot:icon>
    </x-pulse::card-header>

    <x-pulse::scroll :expand="$expand">
        ...
    </x-pulse::scroll>
</x-pulse::card>

$cols$rows$class$expand 變數應傳遞給各自的 Blade 元件,以便可以從儀表板檢視自訂卡片佈局。您可能還希望在檢視中包含 wire:poll.5s="" 屬性,以使卡片自動更新。

一旦您定義了 Livewire 元件和模板,就可以將卡片包含在您的儀表板檢視中:

<x-pulse>
    ...

    <livewire:pulse.top-sellers cols="4" />
</x-pulse>

[!NOTE] 如果您的卡片包含在套件中,您將需要使用 Livewire::component 方法向 Livewire 註冊元件。

樣式設定

如果您的卡片需要超出 Pulse 附帶的類別和元件的額外樣式,有幾種選項可以為您的卡片包含自訂 CSS。

Laravel Vite 整合

如果您的自訂卡片存在於應用程式的程式碼庫中,並且您正在使用 Laravel 的 Vite 整合,您可以更新您的 vite.config.js 檔案以包含卡片的專用 CSS 入口點:

laravel({
    input: [
        'resources/css/pulse/top-sellers.css',
        // ...
    ],
}),

然後,您可以在儀表板檢視中使用 @vite Blade 指令,指定卡片的 CSS 入口點:

<x-pulse>
    @vite('resources/css/pulse/top-sellers.css')

    ...
</x-pulse>

CSS 檔案

對於其他使用案例,包括包含在套件中的 Pulse 卡片,您可以指示 Pulse 載入額外的樣式表,方法是在 Livewire 元件上定義一個返回 CSS 檔案路徑的 css 方法:

class TopSellers extends Card
{
    // ...

    protected function css()
    {
        return __DIR__.'/../../dist/top-sellers.css';
    }
}

當此卡片包含在儀表板中時,Pulse 將自動在 <style> 標籤中包含此檔案的內容,因此不需要將其發佈到 public 目錄。

Tailwind CSS

使用 Tailwind CSS 時,您應該建立一個專用的 CSS 入口點。以下範例排除了 Pulse 已包含的 Tailwind Preflight 基礎樣式,並使用 CSS 選擇器來限定 Tailwind 的範圍,以避免與 Pulse 的 Tailwind 類別衝突:

@import "tailwindcss/theme.css";

@custom-variant dark (&:where(.dark, .dark *));
@source "./../../views/livewire/pulse/top-sellers.blade.php";

@theme {
  /* ... */
}

#top-sellers {
  @import "tailwindcss/utilities.css" source(none);
}

您還需要在卡片檢視中包含一個 idclass 屬性,該屬性與入口點中的 CSS 選擇器匹配:

<x-pulse::card id="top-sellers" :cols="$cols" :rows="$rows" class="$class">
    ...
</x-pulse::card>

資料捕獲與聚合

自訂卡片可以從任何地方獲取和顯示資料;但是,您可能希望利用 Pulse 強大且高效的資料記錄和聚合系統。

捕獲條目

Pulse 允許您使用 Pulse::record 方法記錄「條目」:

use Laravel\Pulse\Facades\Pulse;

Pulse::record('user_sale', $user->id, $sale->amount)
    ->sum()
    ->count();

提供給 record 方法的第一個參數是您正在記錄的條目的 type,第二個參數是決定聚合資料應如何分組的 key。對於大多數聚合方法,您還需要指定要聚合的 value。在上面的範例中,正在聚合的值是 $sale->amount。然後,您可以呼叫一個或多個聚合方法(例如 sum),以便 Pulse 可以將預先聚合的值捕獲到「儲存桶」中,以便以後有效率地檢索。

可用的聚合方法有:

  • avg
  • count
  • max
  • min
  • sum

[!NOTE] 在建立捕獲當前已認證使用者 ID 的卡片套件時,您應該使用 Pulse::resolveAuthenticatedUserId() 方法,該方法會尊重對應用程式所做的任何使用者解析器自訂

檢索聚合資料

在擴展 Pulse 的 Card Livewire 元件時,您可以使用 aggregate 方法來檢索儀表板當前查看時間範圍內的聚合資料:

class TopSellers extends Card
{
    public function render()
    {
        return view('livewire.pulse.top-sellers', [
            'topSellers' => $this->aggregate('user_sale', ['sum', 'count'])
        ]);
    }
}

aggregate 方法返回一個 PHP stdClass 物件的集合。每個物件將包含之前捕獲的 key 屬性,以及每個請求的聚合的金鑰:

@foreach ($topSellers as $seller)
    {{ $seller->key }}
    {{ $seller->sum }}
    {{ $seller->count }}
@endforeach

Pulse 將主要從預先聚合的儲存桶中檢索資料;因此,指定的聚合必須事先使用 Pulse::record 方法捕獲。最舊的儲存桶通常會部分落在時間範圍之外,因此 Pulse 將聚合最舊的條目來填補間隙,並為整個時間範圍提供準確的值,而無需在每次輪詢請求時聚合整個時間範圍。

您還可以使用 aggregateTotal 方法檢索給定型別的總值。例如,以下方法將檢索所有使用者銷售的總額,而不是按使用者分組。

$total = $this->aggregateTotal('user_sale', 'sum');

顯示使用者

在處理以使用者 ID 作為金鑰記錄的聚合時,您可以使用 Pulse::resolveUsers 方法將金鑰解析為使用者記錄:

$aggregates = $this->aggregate('user_sale', ['sum', 'count']);

$users = Pulse::resolveUsers($aggregates->pluck('key'));

return view('livewire.pulse.top-sellers', [
    'sellers' => $aggregates->map(fn ($aggregate) => (object) [
        'user' => $users->find($aggregate->key),
        'sum' => $aggregate->sum,
        'count' => $aggregate->count,
    ])
]);

find 方法返回一個包含 nameextraavatar 金鑰的物件,您可以選擇將它直接傳遞給 <x-pulse::user-card> Blade 元件:

<x-pulse::user-card :user="{{ $seller->user }}" :stats="{{ $seller->sum }}" />

自訂記錄器

套件作者可能希望提供記錄器類別,以允許使用者配置資料的捕獲。

記錄器在應用程式的 config/pulse.php 配置檔案的 recorders 部分中註冊:

[
    // ...
    'recorders' => [
        Acme\Recorders\Deployments::class => [
            // ...
        ],

        // ...
    ],
]

記錄器可以透過指定 $listen 屬性來監聽事件。Pulse 將自動註冊監聽器並呼叫記錄器的 record 方法:

<?php

namespace Acme\Recorders;

use Acme\Events\Deployment;
use Illuminate\Support\Facades\Config;
use Laravel\Pulse\Facades\Pulse;

class Deployments
{
    /**
     * The events to listen for.
     *
     * @var array<int, class-string>
     */
    public array $listen = [
        Deployment::class,
    ];

    /**
     * Record the deployment.
     */
    public function record(Deployment $event): void
    {
        $config = Config::get('pulse.recorders.'.static::class);

        Pulse::record(
            // ...
        );
    }
}