Skip to content
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待
虚位以待

Laravel Pulse

简介

Laravel Pulse 能够一目了然地洞察应用程序的性能和使用情况。借助 Pulse,你可以追踪诸如慢作业和慢端点等瓶颈,找到最活跃的用户,以及更多信息。

如需对单个事件进行深入调试,请查看 Laravel Telescope

安装

WARNING

Pulse 的官方存储实现目前需要 MySQL、MariaDB 或 PostgreSQL 数据库。如果你使用的是其他数据库引擎,则需要为 Pulse 数据准备一个单独的 MySQL、MariaDB 或 PostgreSQL 数据库。

你可以使用 Composer 包管理器安装 Pulse:

shell
composer require laravel/pulse

接下来,你需要使用 vendor:publish Artisan 命令发布 Pulse 的配置文件和迁移文件:

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

最后,你应该运行 migrate 命令来创建存储 Pulse 数据所需的表:

shell
php artisan migrate

Pulse 的数据库迁移运行后,你可以通过 /pulse 路由访问 Pulse 仪表盘。

NOTE

如果你不想将 Pulse 数据存储在应用程序的主数据库中,可以 指定一个专用的数据库连接

配置

许多 Pulse 配置选项可以通过环境变量控制。要查看可用选项、注册新的记录器或配置高级选项,你可以发布 config/pulse.php 配置文件:

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

仪表盘

授权

Pulse 仪表盘可以通过 /pulse 路由访问。默认情况下,你只能在 local 环境中访问此仪表盘,因此你需要为生产环境配置授权,通过自定义 'viewPulse' 授权门面来实现。你可以在应用程序的 app/Providers/AppServiceProvider.php 文件中完成此操作:

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

/**
 * 引导任何应用服务。
 */
public function boot(): void
{
    Gate::define('viewPulse', function (User $user) {
        return $user->isAdmin();
    });

    // ...
}

自定义

Pulse 仪表盘的卡片和布局可以通过发布仪表盘视图进行配置。仪表盘视图将被发布到 resources/views/vendor/pulse/dashboard.blade.php

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

仪表盘由 Livewire 提供支持,允许你自定义卡片和布局,而无需重建任何 JavaScript 资源。

在此文件中,<x-pulse> 组件负责渲染仪表盘,并为卡片提供网格布局。如果你希望仪表盘占满整个屏幕宽度,可以为组件提供 full-width 属性:

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

默认情况下,<x-pulse> 组件会创建一个 12 列的网格,但你可以使用 cols 属性进行自定义:

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

每个卡片接受 colsrows 属性来控制空间和定位:

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

大多数卡片还接受一个 expand 属性,用于显示完整的卡片而不是滚动:

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

解析用户

对于显示用户信息的卡片,例如“应用程序使用情况”卡片,Pulse 仅记录用户的 ID。在渲染仪表盘时,Pulse 将从默认的 Authenticatable 模型中解析 nameemail 字段,并使用 Gravatar Web 服务显示头像。

你可以通过在应用程序的 App\Providers\AppServiceProvider 类中调用 Pulse::user 方法来自定义字段和头像。

user 方法接受一个闭包,该闭包将接收要显示的 Authenticatable 模型,并应返回一个包含用户 nameextraavatar 信息的数组:

php
use Laravel\Pulse\Facades\Pulse;

/**
 * 引导任何应用服务。
 */
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

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

应用程序使用情况

<livewire:pulse.usage /> 卡片显示向应用程序发出请求、调度作业以及遇到慢请求的前 10 名用户。

如果你想同时在屏幕上查看所有使用情况指标,可以多次包含该卡片并指定 type 属性:

blade
<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 /> 卡片显示超过配置阈值的应用程序传入请求,默认阈值为 1000 毫秒。有关更多信息,请参阅 慢请求记录器 的文档。

慢作业

<livewire:pulse.slow-jobs /> 卡片显示应用程序中超过配置阈值的排队作业,默认阈值为 1000 毫秒。有关更多信息,请参阅 慢作业记录器 的文档。

慢查询

<livewire:pulse.slow-queries /> 卡片显示应用程序中超过配置阈值的数据库查询,默认阈值为 1000 毫秒。

默认情况下,慢查询根据 SQL 查询(不带绑定)及其发生的位置进行分组,但如果你希望仅根据 SQL 查询进行分组,可以选择不捕获位置。

如果你因超大 SQL 查询进行语法高亮而遇到渲染性能问题,可以通过添加 without-highlighting 属性来禁用高亮:

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

有关更多信息,请参阅 慢查询记录器 的文档。

慢外部请求

<livewire:pulse.slow-outgoing-requests /> 卡片显示使用 Laravel 的 HTTP 客户端 发出的、超过配置阈值的外部请求,默认阈值为 1000 毫秒。

默认情况下,条目将按完整 URL 分组。但是,你可能希望使用正则表达式规范化或分组相似的外部请求。有关更多信息,请参阅 慢外部请求记录器 的文档。

缓存

<livewire:pulse.cache /> 卡片显示应用程序的缓存命中率和未命中率统计信息,包括全局和单个键。

默认情况下,条目将按键分组。但是,你可能希望使用正则表达式规范化或分组相似的键。有关更多信息,请参阅 缓存交互记录器 的文档。

捕获条目

大多数 Pulse 记录器会根据 Laravel 调度的框架事件自动捕获条目。但是,服务器记录器 和一些第三方卡片需要定期轮询信息。要使用这些卡片,你必须在所有单个应用程序服务器上运行 pulse:check 守护进程:

php
php artisan pulse:check

NOTE

要让 pulse:check 进程永久在后台运行,你应该使用进程监视器(例如 Supervisor)来确保命令不会停止运行。

由于 pulse:check 命令是一个长时间运行的进程,如果不重启,它将不会看到代码库的更改。你应该在应用程序部署过程中通过调用 pulse:restart 命令来优雅地重启该命令:

shell
php artisan pulse:restart

NOTE

Pulse 使用 缓存 来存储重启信号,因此在使用此功能之前,你应该验证是否为应用程序正确配置了缓存驱动。

记录器

记录器负责从应用程序捕获条目,以便记录在 Pulse 数据库中。记录器在 Pulse 配置文件recorders 部分中注册和配置。

缓存交互

CacheInteractions 记录器捕获应用程序中发生的 缓存 命中和未命中信息,用于在 缓存 卡片上显示。

你可以选择调整 采样率 和忽略的键模式。

你还可以配置键分组,以便将相似的键分组为单个条目。例如,你可能希望从缓存相同类型信息的键中删除唯一 ID。分组使用正则表达式来“查找并替换”键的部分。配置文件中包含一个示例:

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

第一个匹配的模式将被使用。如果没有模式匹配,则键将按原样捕获。

异常

Exceptions 记录器捕获应用程序中发生的可报告异常的信息,用于在 异常 卡片上显示。

你可以选择调整 采样率 和忽略的异常模式。你还可以配置是否捕获异常发生的位置。捕获的位置将显示在 Pulse 仪表盘上,有助于追踪异常来源;但是,如果同一异常在多个位置发生,它将为每个唯一位置多次出现。

队列

Queues 记录器捕获应用程序队列的信息,用于在 队列 卡片上显示。

你可以选择调整 采样率 和忽略的作业模式。

慢作业

SlowJobs 记录器捕获应用程序中发生的慢作业信息,用于在 慢作业 卡片上显示。

你可以选择调整慢作业阈值、采样率 和忽略的作业模式。

你可能有一些作业预计比其他作业耗时更长。在这种情况下,你可以配置每个作业的阈值:

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

如果没有正则表达式模式匹配作业的类名,则将使用 'default' 值。

慢外部请求

SlowOutgoingRequests 记录器捕获使用 Laravel 的 HTTP 客户端 发出的、超过配置阈值的慢外部 HTTP 请求信息,用于在 慢外部请求 卡片上显示。

你可以选择调整慢外部请求阈值、采样率 和忽略的 URL 模式。

你可能有一些外部请求预计比其他请求耗时更长。在这种情况下,你可以配置每个请求的阈值:

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

如果没有正则表达式模式匹配请求的 URL,则将使用 'default' 值。

你还可以配置 URL 分组,以便将相似的 URL 分组为单个条目。例如,你可能希望从 URL 路径中删除唯一 ID,或仅按域名分组。分组使用正则表达式来“查找并替换”URL 的部分。配置文件中包含一些示例:

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

第一个匹配的模式将被使用。如果没有模式匹配,则 URL 将按原样捕获。

慢查询

SlowQueries 记录器捕获应用程序中超过配置阈值的任何数据库查询,用于在 慢查询 卡片上显示。

你可以选择调整慢查询阈值、采样率 和忽略的查询模式。你还可以配置是否捕获查询位置。捕获的位置将显示在 Pulse 仪表盘上,有助于追踪查询来源;但是,如果同一查询在多个位置执行,它将为每个唯一位置多次出现。

你可能有一些查询预计比其他查询耗时更长。在这种情况下,你可以配置每个查询的阈值:

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

如果没有正则表达式模式匹配查询的 SQL,则将使用 'default' 值。

慢请求

Requests 记录器捕获对应用程序发出的请求信息,用于在 慢请求应用程序使用情况 卡片上显示。

你可以选择调整慢路由阈值、采样率 和忽略的路径。

你可能有一些请求预计比其他请求耗时更长。在这种情况下,你可以配置每个请求的阈值:

php
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 方法中调用:

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

/**
 * 引导任何应用服务。
 */
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 或更高版本,并且应用程序配置的 Redis 客户端驱动为 phpredispredis

默认情况下,Pulse 会在 HTTP 响应发送给客户端或作业处理完成后,直接将条目存储到 配置的数据库连接 中;但是,你可以使用 Pulse 的 Redis 摄取驱动将条目发送到 Redis 流中。这可以通过配置 PULSE_INGEST_DRIVER 环境变量来启用:

ini
PULSE_INGEST_DRIVER=redis

默认情况下,Pulse 将使用你的默认 Redis 连接,但你可以通过 PULSE_REDIS_CONNECTION 环境变量进行自定义:

ini
PULSE_REDIS_CONNECTION=pulse

WARNING

当使用 Redis 摄取驱动时,你的 Pulse 安装应始终使用与由 Redis 驱动的队列(如果适用)不同的 Redis 连接。

当使用 Redis 摄取时,你需要运行 pulse:work 命令来监视流并将条目从 Redis 移动到 Pulse 的数据库表中。

php
php artisan pulse:work

NOTE

要让 pulse:work 进程永久在后台运行,你应该使用进程监视器(例如 Supervisor)来确保 Pulse 工作进程不会停止运行。

由于 pulse:work 命令是一个长时间运行的进程,如果不重启,它将不会看到代码库的更改。你应该在应用程序部署过程中通过调用 pulse:restart 命令来优雅地重启该命令:

shell
php artisan pulse:restart

NOTE

Pulse 使用 缓存 来存储重启信号,因此在使用此功能之前,你应该验证是否为应用程序正确配置了缓存驱动。

采样

默认情况下,Pulse 会捕获应用程序中发生的每个相关事件。对于高流量应用程序,这可能导致在仪表盘中需要聚合数百万个数据库行,尤其是在较长的时间段内。

你可以选择在某些 Pulse 数据记录器上启用“采样”。例如,在 用户请求 记录器上将采样率设置为 0.1 意味着你仅记录大约 10% 的应用程序请求。在仪表盘中,这些值将被放大并加上 ~ 前缀,表示它们是近似值。

通常,对于特定指标,你拥有的条目越多,你可以安全设置的采样率就越低,而不会牺牲太多准确性。

修剪

一旦存储的条目超出仪表盘的时间窗口,Pulse 将自动修剪它们。修剪在摄取数据时通过一种抽签系统进行,可以在 Pulse 配置文件 中自定义。

处理 Pulse 异常

如果在捕获 Pulse 数据时发生异常(例如无法连接到存储数据库),Pulse 将静默失败,以避免影响应用程序。

如果你希望自定义如何处理这些异常,可以向 handleExceptionsUsing 方法提供一个闭包:

php
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 组件,并定义相应的视图:

php
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 组件以获得一致的外观和感觉:

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 组件和模板,就可以将卡片包含在 仪表盘视图 中:

blade
<x-pulse>
    ...

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

NOTE

如果你的卡片包含在包中,则需要使用 Livewire::component 方法向 Livewire 注册组件。

样式

如果你的卡片需要超出 Pulse 所包含的类和组件的额外样式,有几种选项可以为卡片包含自定义 CSS。

Laravel Vite 集成

如果你的自定义卡片位于应用程序的代码库中,并且你正在使用 Laravel 的 Vite 集成,你可以更新 vite.config.js 文件,为卡片包含一个专用的 CSS 入口点:

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

然后,你可以在 仪表盘视图 中使用 @vite Blade 指令,指定卡片的 CSS 入口点:

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

    ...
</x-pulse>

CSS 文件

对于其他用例,包括包含在包中的 Pulse 卡片,你可以指示 Pulse 通过在你的 Livewire 组件上定义一个 css 方法来加载额外的样式表,该方法返回你的 CSS 文件的路径:

php
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 类冲突:

css
@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 选择器匹配:

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

数据捕获与聚合

自定义卡片可以从任何地方获取和显示数据;但是,你可能希望利用 Pulse 强大且高效的数据记录和聚合系统。

捕获条目

Pulse 允许你使用 Pulse::record 方法记录“条目”:

php
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 方法检索仪表盘中当前查看期间的聚合数据:

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

aggregate 方法返回一个 PHP stdClass 对象的集合。每个对象将包含先前捕获的 key 属性,以及每个请求的聚合对应的键:

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

Pulse 将主要从预聚合的存储桶中检索数据;因此,指定的聚合必须事先使用 Pulse::record 方法捕获。最旧的存储桶通常部分落在期间之外,因此 Pulse 将聚合最旧的条目以填补空白,并为整个期间提供准确的值,而无需在每次轮询请求时聚合整个期间。

你还可以使用 aggregateTotal 方法检索给定类型的总值。例如,以下方法将检索所有用户销售的总和,而不是按用户分组。

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

显示用户

当处理以用户 ID 作为键的聚合时,你可以使用 Pulse::resolveUsers 方法将键解析为用户记录:

php
$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 组件:

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

自定义记录器

包作者可能希望提供记录器类,以允许用户配置数据的捕获。

记录器在应用程序的 config/pulse.php 配置文件的 recorders 部分中注册:

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

        // ...
    ],
]

记录器可以通过指定 $listen 属性来监听事件。Pulse 将自动注册监听器,并调用记录器的 record 方法:

php
<?php

namespace Acme\Recorders;

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

class Deployments
{
    /**
     * 要监听的事件。
     *
     * @var array<int, class-string>
     */
    public array $listen = [
        Deployment::class,
    ];

    /**
     * 记录部署。
     */
    public function record(Deployment $event): void
    {
        $config = Config::get('pulse.recorders.'.static::class);

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