はじめに

Laravel Pulseは、アプリケーションのパフォーマンスと使用状況に関する一目でわかる洞察を提供します。Pulseを使用すると、遅いジョブやエンドポイントなどのボトルネックを特定し、最もアクティブなユーザーを見つけることができます。

個々のイベントの詳細なデバッグについては、Laravel Telescopeを確認してください。

インストール

Pulseのファーストパーティストレージ実装は、現在MySQL、MariaDB、またはPostgreSQLデータベースを必要とします。異なるデータベースエンジンを使用している場合は、Pulseデータ用に別のMySQL、MariaDB、またはPostgreSQLデータベースが必要です。

Composerパッケージマネージャーを使用してPulseをインストールできます:

  1. composer require laravel/pulse

次に、vendor:publish Artisanコマンドを使用してPulseの設定とマイグレーションファイルを公開する必要があります:

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

最後に、Pulseのデータを保存するために必要なテーブルを作成するためにmigrateコマンドを実行する必要があります:

  1. php artisan migrate

Pulseのデータベースマイグレーションが実行されたら、/pulseルートを介してPulseダッシュボードにアクセスできます。

アプリケーションのプライマリデータベースにPulseデータを保存したくない場合は、専用データベース接続を指定することができます。

設定

Pulseの多くの設定オプションは、環境変数を使用して制御できます。利用可能なオプションを確認したり、新しいレコーダーを登録したり、高度なオプションを設定したりするには、config/pulse.php設定ファイルを公開することができます:

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

ダッシュボード

認証

Pulseダッシュボードには/pulseルートを介してアクセスできます。デフォルトでは、local環境でのみこのダッシュボードにアクセスできるため、'viewPulse'認証ゲートをカスタマイズして本番環境の認証を設定する必要があります。これは、アプリケーションのapp/Providers/AppServiceProvider.phpファイル内で実行できます:

  1. use App\Models\User;
  2. use Illuminate\Support\Facades\Gate;
  3. /**
  4. * Bootstrap any application services.
  5. */
  6. public function boot(): void
  7. {
  8. Gate::define('viewPulse', function (User $user) {
  9. return $user->isAdmin();
  10. });
  11. // ...
  12. }

カスタマイズ

Pulseダッシュボードのカードとレイアウトは、ダッシュボードビューを公開することで設定できます。ダッシュボードビューはresources/views/vendor/pulse/dashboard.blade.phpに公開されます:

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

ダッシュボードはLivewireによって動作し、JavaScriptアセットを再構築することなくカードとレイアウトをカスタマイズできます。

このファイル内で、<x-pulse>コンポーネントはダッシュボードのレンダリングを担当し、カードのグリッドレイアウトを提供します。ダッシュボードが画面の全幅に広がるようにするには、full-widthプロップをコンポーネントに提供できます:

  1. <x-pulse full-width>
  2. ...
  3. </x-pulse>

デフォルトでは、<x-pulse>コンポーネントは12列のグリッドを作成しますが、colsプロップを使用してこれをカスタマイズできます:

  1. <x-pulse cols="16">
  2. ...
  3. </x-pulse>

各カードは、スペースと位置を制御するためにcolsおよびrowsプロップを受け入れます:

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

ほとんどのカードは、スクロールするのではなく完全なカードを表示するためにexpandプロップも受け入れます:

  1. <livewire:pulse.slow-queries expand />

ユーザーの解決

ユーザーに関する情報を表示するカード、たとえばアプリケーション使用状況カードでは、PulseはユーザーのIDのみを記録します。ダッシュボードをレンダリングする際、PulseはデフォルトのAuthenticatableモデルからnameおよびemailフィールドを解決し、Gravatarウェブサービスを使用してアバターを表示します。

アプリケーションのApp\Providers\AppServiceProviderクラス内でPulse::userメソッドを呼び出すことで、フィールドとアバターをカスタマイズできます。

  1. ``````php
  2. use Laravel\Pulse\Facades\Pulse;
  3. /**
  4. * Bootstrap any application services.
  5. */
  6. public function boot(): void
  7. {
  8. Pulse::user(fn ($user) => [
  9. 'name' => $user->name,
  10. 'extra' => $user->email,
  11. 'avatar' => $user->avatar_url,
  12. ]);
  13. // ...
  14. }
  15. `

認証されたユーザーの取得方法を完全にカスタマイズするには、Laravel\Pulse\Contracts\ResolvesUsers契約を実装し、Laravelのサービスコンテナにバインドする必要があります。

カード

サーバー

<livewire:pulse.servers />カードは、pulse:checkコマンドを実行しているすべてのサーバーのシステムリソース使用状況を表示します。システムリソース報告に関する詳細は、サーバーレコーダーのドキュメントを参照してください。

インフラストラクチャ内のサーバーを置き換える場合、一定の期間後にPulseダッシュボードに非アクティブなサーバーを表示しないようにすることをお勧めします。これは、非アクティブなサーバーがPulseダッシュボードから削除されるまでの秒数を受け入れるignore-afterプロップを使用して実現できます。あるいは、1 hour3 days and 1 hourのような相対時間形式の文字列を提供することもできます:

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

アプリケーション使用状況

<livewire:pulse.usage />カードは、アプリケーションにリクエストを送信し、ジョブをディスパッチし、遅いリクエストを経験している上位10ユーザーを表示します。

すべての使用状況メトリックを同時に画面に表示したい場合は、カードを複数回含め、type属性を指定できます:

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

Pulseがユーザー情報を取得して表示する方法をカスタマイズする方法については、ユーザーの解決に関するドキュメントを参照してください。

アプリケーションが多くのリクエストを受け取ったり、多くのジョブをディスパッチしたりする場合は、サンプリングを有効にすることをお勧めします。ユーザーリクエストレコーダーユーザージョブレコーダー、および遅いジョブレコーダーのドキュメントを参照して、詳細を確認してください。

例外

<livewire:pulse.exceptions />カードは、アプリケーションで発生する例外の頻度と最近性を示します。デフォルトでは、例外は例外クラスと発生した場所に基づいてグループ化されます。詳細については、例外レコーダーのドキュメントを参照してください。

キュー

<livewire:pulse.queues />カードは、アプリケーション内のキューのスループットを示し、キューに入れられたジョブの数、処理中のジョブ、処理済みのジョブ、リリースされたジョブ、および失敗したジョブを含みます。キューレコーダーのドキュメントを参照して、詳細を確認してください。

遅いリクエスト

<livewire:pulse.slow-requests />カードは、設定された閾値を超えるアプリケーションへのリクエストを示します。デフォルトでは、閾値は1,000msです。遅いリクエストレコーダーのドキュメントを参照して、詳細を確認してください。

遅いジョブ

<livewire:pulse.slow-jobs />カードは、設定された閾値を超えるアプリケーション内のキューに入れられたジョブを示します。デフォルトでは、閾値は1,000msです。遅いジョブレコーダーのドキュメントを参照して、詳細を確認してください。

遅いクエリ

<livewire:pulse.slow-queries />カードは、設定された閾値を超えるアプリケーション内のデータベースクエリを示します。デフォルトでは、遅いクエリはSQLクエリ(バインディングなし)と発生した場所に基づいてグループ化されますが、SQLクエリのみに基づいてグループ化したい場合は、場所をキャプチャしないことを選択できます。

非常に大きなSQLクエリが構文ハイライトを受けてレンダリングパフォーマンスの問題が発生した場合は、without-highlightingプロップを追加することでハイライトを無効にできます:

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

詳細については、遅いクエリレコーダーのドキュメントを参照してください。

遅い送信リクエスト

<livewire:pulse.slow-outgoing-requests />カードは、設定された閾値を超えるLaravelのHTTPクライアントを使用して行われた送信リクエストを示します。デフォルトでは、エントリは完全なURLでグループ化されます。ただし、正規表現を使用して類似の送信リクエストを正規化またはグループ化することをお勧めします。詳細については、遅い送信リクエストレコーダーのドキュメントを参照してください。

キャッシュ

<livewire:pulse.cache />カードは、アプリケーションのキャッシュヒットとミスの統計を、グローバルおよび個別のキーで示します。

デフォルトでは、エントリはキーでグループ化されます。ただし、正規表現を使用して類似のキーを正規化またはグループ化することをお勧めします。詳細については、キャッシュインタラクションレコーダーのドキュメントを参照してください。

エントリのキャプチャ

ほとんどのPulseレコーダーは、Laravelによってディスパッチされたフレームワークイベントに基づいて自動的にエントリをキャプチャします。ただし、サーバーレコーダーおよび一部のサードパーティカードは、定期的に情報をポーリングする必要があります。これらのカードを使用するには、すべての個別のアプリケーションサーバーでpulse:checkデーモンを実行する必要があります:

  1. php artisan pulse:check
  1. `````pulse:check`````コマンドは長寿命のプロセスであるため、再起動しない限り、コードベースの変更を認識しません。アプリケーションのデプロイプロセス中に`````pulse:restart`````コマンドを呼び出してコマンドを優雅に再起動する必要があります:
  2. ``````sh
  3. php artisan pulse:restart
  4. `

Pulseはキャッシュを使用して再起動信号を保存するため、この機能を使用する前に、アプリケーションにキャッシュドライバーが正しく設定されていることを確認する必要があります。

レコーダー

レコーダーは、アプリケーションからPulseデータベースに記録されるエントリをキャプチャする責任があります。レコーダーは、Pulse設定ファイルrecordersセクションで登録および設定されます。

キャッシュインタラクション

  1. オプションで、[サンプルレート](#sampling)や無視するキーのパターンを調整できます。
  2. 類似のキーを単一のエントリとしてグループ化するようにキーグループ化を設定することもできます。たとえば、同じタイプの情報をキャッシュするキーから一意のIDを削除することをお勧めします。グループは、キーの一部を「見つけて置き換える」ために正規表現を使用して設定されます。設定ファイルに例が含まれています:
  3. ``````php
  4. Recorders\CacheInteractions::class => [
  5. // ...
  6. 'groups' => [
  7. // '/:\d+/' => ':*',
  8. ],
  9. ],
  10. `

最初に一致したパターンが使用されます。一致するパターンがない場合、キーはそのままキャプチャされます。

例外

  1. オプションで、[サンプルレート](#sampling)や無視する例外のパターンを調整できます。また、例外が発生した場所をキャプチャするかどうかを設定することもできます。キャプチャされた場所はPulseダッシュボードに表示され、例外の発生源を追跡するのに役立ちます。ただし、同じ例外が複数の場所で発生した場合、各一意の場所に対して複数回表示されます。
  2. <a name="queues-recorder"></a>
  3. #### キュー
  4. `````Queues`````レコーダーは、[キュー](#queues-card)に表示されるアプリケーションのキューに関する情報をキャプチャします。
  5. オプションで、[サンプルレート](#sampling)や無視するジョブのパターンを調整できます。
  6. <a name="slow-jobs-recorder"></a>
  7. #### 遅いジョブ
  8. `````SlowJobs`````レコーダーは、アプリケーションで発生する遅いジョブに関する情報をキャプチャし、[遅いジョブ](#slow-jobs-recorder)カードに表示します。
  9. オプションで、遅いジョブの閾値、[サンプルレート](#sampling)、および無視するジョブのパターンを調整できます。
  10. 他のジョブよりも長くかかることが予想されるジョブがある場合、その場合はジョブごとの閾値を設定できます:
  11. ``````php
  12. Recorders\SlowJobs::class => [
  13. // ...
  14. 'threshold' => [
  15. '#^App\\Jobs\\GenerateYearlyReports$#' => 5000,
  16. 'default' => env('PULSE_SLOW_JOBS_THRESHOLD', 1000),
  17. ],
  18. ],
  19. `

正規表現パターンがジョブのクラス名に一致しない場合、'default'値が使用されます。

遅い送信リクエスト

  1. オプションで、遅い送信リクエストの閾値、[サンプルレート](#sampling)、および無視するURLパターンを調整できます。
  2. 他の送信リクエストよりも長くかかることが予想されるリクエストがある場合、その場合はリクエストごとの閾値を設定できます:
  3. ``````php
  4. Recorders\SlowOutgoingRequests::class => [
  5. // ...
  6. 'threshold' => [
  7. '#backup.zip$#' => 5000,
  8. 'default' => env('PULSE_SLOW_OUTGOING_REQUESTS_THRESHOLD', 1000),
  9. ],
  10. ],
  11. `

正規表現パターンがリクエストのURLに一致しない場合、'default'値が使用されます。

類似のURLを単一のエントリとしてグループ化するようにURLグループ化を設定することもできます。たとえば、URLパスから一意のIDを削除したり、ドメインのみでグループ化したりすることをお勧めします。グループは、URLの一部を「見つけて置き換える」ために正規表現を使用して設定されます。設定ファイルにいくつかの例が含まれています:

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

最初に一致したパターンが使用されます。一致するパターンがない場合、URLはそのままキャプチャされます。

遅いクエリ

  1. オプションで、遅いクエリの閾値、[サンプルレート](#sampling)、および無視するクエリのパターンを調整できます。また、クエリの場所をキャプチャするかどうかを設定することもできます。キャプチャされた場所はPulseダッシュボードに表示され、クエリの発生源を追跡するのに役立ちます。ただし、同じクエリが複数の場所で行われた場合、各一意の場所に対して複数回表示されます。
  2. 他のクエリよりも長くかかることが予想されるクエリがある場合、その場合はクエリごとの閾値を設定できます:
  3. ``````php
  4. Recorders\SlowQueries::class => [
  5. // ...
  6. 'threshold' => [
  7. '#^insert into `yearly_reports`#' => 5000,
  8. 'default' => env('PULSE_SLOW_QUERIES_THRESHOLD', 1000),
  9. ],
  10. ],
  11. `

正規表現パターンがクエリのSQLに一致しない場合、'default'値が使用されます。

遅いリクエスト

  1. オプションで、遅いルートの閾値、[サンプルレート](#sampling)、および無視するパスを調整できます。
  2. 他のリクエストよりも長くかかることが予想されるリクエストがある場合、その場合はリクエストごとの閾値を設定できます:
  3. ``````php
  4. Recorders\SlowRequests::class => [
  5. // ...
  6. 'threshold' => [
  7. '#^/admin/#' => 5000,
  8. 'default' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
  9. ],
  10. ],
  11. `

正規表現パターンがリクエストのURLに一致しない場合、'default'値が使用されます。

サーバー

  1. 各報告サーバーは一意の名前を持つ必要があります。デフォルトでは、PulsePHP`````gethostname`````関数によって返される値を使用します。これをカスタマイズしたい場合は、`````PULSE_SERVER_NAME`````環境変数を設定できます:
  2. ``````env
  3. PULSE_SERVER_NAME=load-balancer
  4. `

Pulse設定ファイルでは、監視するディレクトリをカスタマイズすることもできます。

ユーザージョブ

  1. オプションで、[サンプルレート](#sampling)や無視するジョブのパターンを調整できます。
  2. <a name="user-requests-recorder"></a>
  3. #### ユーザーリクエスト
  4. `````UserRequests`````レコーダーは、アプリケーションにリクエストを送信するユーザーに関する情報をキャプチャし、[アプリケーション使用状況](#application-usage-card)カードに表示します。
  5. オプションで、[サンプルレート](#sampling)や無視するURLパターンを調整できます。
  6. <a name="filtering"></a>
  7. ### フィルタリング
  8. これまで見てきたように、多くの[レコーダー](#recorders)は、設定を介して、リクエストのURLなどの値に基づいて受信エントリを「無視」する機能を提供します。しかし、時には、現在認証されているユーザーなどの他の要因に基づいてレコードをフィルタリングすることが有用な場合があります。これらのレコードをフィルタリングするには、Pulse`````filter`````メソッドにクロージャを渡すことができます。通常、`````filter`````メソッドは、アプリケーションの`````boot`````メソッド内で呼び出されるべきです:
  9. ``````php
  10. use Illuminate\Support\Facades\Auth;
  11. use Laravel\Pulse\Entry;
  12. use Laravel\Pulse\Facades\Pulse;
  13. use Laravel\Pulse\Value;
  14. /**
  15. * Bootstrap any application services.
  16. */
  17. public function boot(): void
  18. {
  19. Pulse::filter(function (Entry|Value $entry) {
  20. return Auth::user()->isNotAdmin();
  21. });
  22. // ...
  23. }
  24. `

パフォーマンス

Pulseは、追加のインフラストラクチャを必要とせずに既存のアプリケーションに組み込むように設計されています。ただし、高トラフィックのアプリケーションの場合、Pulseがアプリケーションのパフォーマンスに与える影響を取り除く方法はいくつかあります。

異なるデータベースの使用

高トラフィックのアプリケーションの場合、Pulseのために専用のデータベース接続を使用して、アプリケーションデータベースに影響を与えないようにすることをお勧めします。

Pulseが使用するデータベース接続PULSE_DB_CONNECTION環境変数を設定することでカスタマイズできます。

  1. PULSE_DB_CONNECTION=pulse

Redisインジェスト

Redisインジェストは、Redis 6.2以上とphpredisまたはpredisをアプリケーションの設定されたRedisクライアントドライバーとして必要とします。

デフォルトでは、PulseはHTTPレスポンスがクライアントに送信された後、またはジョブが処理された後に設定されたデータベース接続にエントリを直接保存します。ただし、PulseのRedisインジェストドライバーを使用して、エントリをRedisストリームに送信することもできます。これは、PULSE_INGEST_DRIVER環境変数を設定することで有効にできます:

  1. PULSE_INGEST_DRIVER=redis

PulseはデフォルトでRedis接続を使用しますが、PULSE_REDIS_CONNECTION環境変数を介してこれをカスタマイズできます:

  1. PULSE_REDIS_CONNECTION=pulse

Redisインジェストを使用する場合、pulse:workコマンドを実行してストリームを監視し、エントリをRedisからPulseのデータベーステーブルに移動する必要があります。

  1. php artisan pulse:work
  1. `````pulse:work`````コマンドは長寿命のプロセスであるため、再起動しない限り、コードベースの変更を認識しません。アプリケーションのデプロイプロセス中に`````pulse:restart`````コマンドを呼び出してコマンドを優雅に再起動する必要があります:
  2. ``````sh
  3. php artisan pulse:restart
  4. `

Pulseはキャッシュを使用して再起動信号を保存するため、この機能を使用する前に、アプリケーションにキャッシュドライバーが正しく設定されていることを確認する必要があります。

サンプリング

デフォルトでは、Pulseはアプリケーション内で発生するすべての関連イベントをキャプチャします。高トラフィックのアプリケーションでは、特に長期間にわたってダッシュボードに数百万のデータベース行を集約する必要が生じる可能性があります。

代わりに、特定のPulseデータレコーダーで「サンプリング」を有効にすることを選択できます。たとえば、User Requestsレコーダーでサンプルレートを0.1に設定すると、アプリケーションへのリクエストの約10%のみを記録します。ダッシュボードでは、値がスケールアップされ、~で接頭辞が付けられ、近似値であることが示されます。

一般的に、特定のメトリックに対してエントリが多いほど、精度をあまり犠牲にせずにサンプルレートを安全に低く設定できます。

トリミング

Pulseは、ダッシュボードウィンドウの外にあるストレージエントリを自動的にトリミングします。トリミングは、Pulseの設定ファイルでカスタマイズできるロッタリーシステムを使用してデータを取り込む際に発生します。

Pulse例外の処理

Pulseデータをキャプチャ中に例外が発生した場合、たとえばストレージデータベースに接続できない場合、Pulseはアプリケーションに影響を与えないように静かに失敗します。

これらの例外の処理方法をカスタマイズしたい場合は、handleExceptionsUsingメソッドにクロージャを提供できます:

  1. use Laravel\Pulse\Facades\Pulse;
  2. use Illuminate\Support\Facades\Log;
  3. Pulse::handleExceptionsUsing(function ($e) {
  4. Log::debug('An exception happened in Pulse', [
  5. 'message' => $e->getMessage(),
  6. 'stack' => $e->getTraceAsString(),
  7. ]);
  8. });

カスタムカード

Pulseを使用すると、アプリケーションの特定のニーズに関連するデータを表示するカスタムカードを作成できます。PulseはLivewireを使用しているため、最初のカスタムカードを作成する前にそのドキュメントを確認することをお勧めします。

カードコンポーネント

Laravel Pulseでカスタムカードを作成するには、基本のCard Livewireコンポーネントを拡張し、対応するビューを定義します:

  1. namespace App\Livewire\Pulse;
  2. use Laravel\Pulse\Livewire\Card;
  3. use Livewire\Attributes\Lazy;
  4. #[Lazy]
  5. class TopSellers extends Card
  6. {
  7. public function render()
  8. {
  9. return view('livewire.pulse.top-sellers');
  10. }
  11. }

Livewireのレイジーローディング機能を使用する場合、Cardコンポーネントは、colsおよびrows属性をコンポーネントに渡すことを尊重するプレースホルダーを自動的に提供します。

Pulseカードの対応するビューを書くときは、PulseのBladeコンポーネントを活用して一貫した外観と感触を得ることができます:

  1. <x-pulse::card :cols="$cols" :rows="$rows" :class="$class" wire:poll.5s="">
  2. <x-pulse::card-header name="Top Sellers">
  3. <x-slot:icon>
  4. ...
  5. </x-slot:icon>
  6. </x-pulse::card-header>
  7. <x-pulse::scroll :expand="$expand">
  8. ...
  9. </x-pulse::scroll>
  10. </x-pulse::card>
  1. Livewireコンポーネントとテンプレートを定義したら、カードは[ダッシュボードビュー](#dashboard-customization)に含めることができます:
  2. ``````blade
  3. <x-pulse>
  4. ...
  5. <livewire:pulse.top-sellers cols="4" />
  6. </x-pulse>
  7. `

カードがパッケージに含まれている場合、Livewire::componentメソッドを使用してLivewireにコンポーネントを登録する必要があります。

スタイリング

カードにPulseに含まれるクラスやコンポーネントを超える追加のスタイリングが必要な場合、カードにカスタムCSSを含めるためのいくつかのオプションがあります。

Laravel Vite統合

カスタムカードがアプリケーションのコードベース内にあり、LaravelのVite統合を使用している場合、vite.config.jsファイルを更新してカードの専用CSSエントリポイントを含めることができます:

  1. laravel({
  2. input: [
  3. 'resources/css/pulse/top-sellers.css',
  4. // ...
  5. ],
  6. }),

その後、ダッシュボードビュー@vite Bladeディレクティブを使用して、カードのCSSエントリポイントを指定できます:

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

CSSファイル

パッケージ内に含まれるPulseカードなど、他のユースケースの場合、LivewireコンポーネントにCSSファイルへのファイルパスを返すcssメソッドを定義することで、Pulseに追加のスタイルシートを読み込むように指示できます:

  1. class TopSellers extends Card
  2. {
  3. // ...
  4. protected function css()
  5. {
  6. return __DIR__.'/../../dist/top-sellers.css';
  7. }
  8. }

このカードがダッシュボードに含まれると、Pulseはこのファイルの内容を<style>タグ内に自動的に含めるため、publicディレクトリに公開する必要はありません。

Tailwind CSS

Tailwind CSSを使用する場合、不要なCSSを読み込んだり、PulseのTailwindクラスと競合したりしないように、専用のTailwind設定ファイルを作成する必要があります:

  1. export default {
  2. darkMode: 'class',
  3. important: '#top-sellers',
  4. content: [
  5. './resources/views/livewire/pulse/top-sellers.blade.php',
  6. ],
  7. corePlugins: {
  8. preflight: false,
  9. },
  10. };

その後、CSSエントリポイントで設定ファイルを指定できます:

  1. @config "../../tailwind.top-sellers.config.js";
  2. @tailwind base;
  3. @tailwind components;
  4. @tailwind utilities;

カードのビューに、Tailwindのimportantセレクタ戦略に渡されたセレクタに一致するidまたはclass属性を含める必要があります:

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

データキャプチャと集約

カスタムカードはどこからでもデータを取得して表示できます。ただし、Pulseの強力で効率的なデータ記録および集約システムを活用することをお勧めします。

エントリのキャプチャ

Pulseは、Pulse::recordメソッドを使用して「エントリ」を記録することを許可します:

  1. use Laravel\Pulse\Facades\Pulse;
  2. Pulse::record('user_sale', $user->id, $sale->amount)
  3. ->sum()
  4. ->count();
  1. 利用可能な集約メソッドは次のとおりです:
  2. - `````avg
  • count
  • max
  • min
  • sum

現在認証されているユーザーIDをキャプチャするカードパッケージを構築する場合は、Pulse::resolveAuthenticatedUserId()メソッドを使用する必要があります。このメソッドは、アプリケーションに対して行われたユーザー解決のカスタマイズを尊重します。

集約データの取得

PulseのCard Livewireコンポーネントを拡張する際、aggregateメソッドを使用してダッシュボードで表示されている期間の集約データを取得できます:

  1. class TopSellers extends Card
  2. {
  3. public function render()
  4. {
  5. return view('livewire.pulse.top-sellers', [
  6. 'topSellers' => $this->aggregate('user_sale', ['sum', 'count'])
  7. ]);
  8. }
  9. }
  1. ``````php
  2. @foreach ($topSellers as $seller)
  3. {{ $seller->key }}
  4. {{ $seller->sum }}
  5. {{ $seller->count }}
  6. @endforeach
  7. `

Pulseは主に事前に集約されたバケツからデータを取得します。したがって、指定された集約はPulse::recordメソッドを使用して事前にキャプチャされている必要があります。最も古いバケツは通常、期間の外側に部分的に落ちるため、Pulseは最も古いエントリを集約してギャップを埋め、全期間の正確な値を提供します。各ポーリングリクエストで全期間を集約する必要はありません。

特定のタイプの合計値をaggregateTotalメソッドを使用して取得することもできます。たとえば、次のメソッドは、ユーザーごとにグループ化するのではなく、すべてのユーザーの売上の合計を取得します。

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

ユーザーの表示

ユーザーIDをキーとして記録する集約を扱う場合、Pulse::resolveUsersメソッドを使用してキーをユーザーレコードに解決できます:

  1. $aggregates = $this->aggregate('user_sale', ['sum', 'count']);
  2. $users = Pulse::resolveUsers($aggregates->pluck('key'));
  3. return view('livewire.pulse.top-sellers', [
  4. 'sellers' => $aggregates->map(fn ($aggregate) => (object) [
  5. 'user' => $users->find($aggregate->key),
  6. 'sum' => $aggregate->sum,
  7. 'count' => $aggregate->count,
  8. ])
  9. ]);

findメソッドは、nameextraavatarキーを含むオブジェクトを返します。これを<x-pulse::user-card> Bladeコンポーネントに直接渡すこともできます:

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

カスタムレコーダー

パッケージの著者は、ユーザーがデータのキャプチャを設定できるようにレコーダークラスを提供したいと考えるかもしれません。

レコーダーは、アプリケーションのconfig/pulse.php設定ファイルのrecordersセクションで登録されます:

  1. [
  2. // ...
  3. 'recorders' => [
  4. Acme\Recorders\Deployments::class => [
  5. // ...
  6. ],
  7. // ...
  8. ],
  9. ]

レコーダーは、$listenプロパティを指定することでイベントをリッスンできます。Pulseは自動的にリスナーを登録し、レコーダーのrecordメソッドを呼び出します:

  1. <?php
  2. namespace Acme\Recorders;
  3. use Acme\Events\Deployment;
  4. use Illuminate\Support\Facades\Config;
  5. use Laravel\Pulse\Facades\Pulse;
  6. class Deployments
  7. {
  8. /**
  9. * The events to listen for.
  10. *
  11. * @var array<int, class-string>
  12. */
  13. public array $listen = [
  14. Deployment::class,
  15. ];
  16. /**
  17. * Record the deployment.
  18. */
  19. public function record(Deployment $event): void
  20. {
  21. $config = Config::get('pulse.recorders.'.static::class);
  22. Pulse::record(
  23. // ...
  24. );
  25. }
  26. }