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 的许多配置项都可以通过环境变量控制。若要查看可用选项、注册新的 recorder,或配置高级选项,你可以发布 config/pulse.php 配置文件:

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

仪表板

授权

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

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

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

仪表板由 Livewire 驱动,因此你无需重建任何 JavaScript 资源,就可以自定义卡片和布局。

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

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

默认情况下,<x-pulse> 组件会创建一个 12 列网格,不过你也可以通过 cols prop 自定义:

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

每张卡片都接受 colsrows prop,用来控制占用空间和布局位置:

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

大多数卡片还接受一个 expand prop,以显示完整卡片而不是滚动内容:

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

解析用户

对于会显示用户信息的卡片,例如 Application Usage 卡片,Pulse 只会记录用户的 ID。在渲染仪表板时,Pulse 会从默认的 Authenticatable 模型中解析 nameemail 字段,并通过 Gravatar Web 服务显示头像。

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

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

php
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 的 service container 中,完全自定义已认证用户的捕获与检索方式。

卡片

Servers

<livewire:pulse.servers /> 卡片会显示所有运行 pulse:check 命令的服务器的系统资源使用情况。关于系统资源上报的更多信息,请参阅服务器 recorder 文档。

如果你的基础设施中替换了某台服务器,你可能希望在一段时间后不再在 Pulse 仪表板中显示这台已停用服务器。你可以使用 ignore-after prop 实现这一点,它接受一个秒数,表示不活跃服务器在多少秒后从 Pulse 仪表板移除。你也可以传入相对时间字符串,例如 1 hour3 days and 1 hour

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

Application Usage

<livewire:pulse.usage /> 卡片会显示发起请求、分发任务以及经历慢请求最多的前 10 位用户。

如果你希望在同一屏幕上同时查看所有使用指标,可以多次引入该卡片,并指定 type 属性:

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

如需了解如何自定义 Pulse 获取和显示用户信息的方式,请参阅解析用户文档。

NOTE

如果你的应用接收了大量请求或分发了大量任务,你可能需要启用采样。更多信息请参阅用户请求 recorder用户任务 recorder慢任务 recorder文档。

Exceptions

<livewire:pulse.exceptions /> 卡片会显示应用中异常的出现频率和最近发生时间。默认情况下,异常会根据异常类以及异常发生的位置进行分组。更多信息请参阅异常 recorder文档。

Queues

<livewire:pulse.queues /> 卡片会显示应用队列的吞吐量,包括排队中、处理中、已处理、已释放和失败的任务数量。更多信息请参阅队列 recorder文档。

Slow Requests

<livewire:pulse.slow-requests /> 卡片会显示超过配置阈值的进入应用的请求,默认阈值为 1,000ms。更多信息请参阅慢请求 recorder文档。

Slow Jobs

<livewire:pulse.slow-jobs /> 卡片会显示超过配置阈值的队列任务,默认阈值为 1,000ms。更多信息请参阅慢任务 recorder文档。

Slow Queries

<livewire:pulse.slow-queries /> 卡片会显示超过配置阈值的数据库查询,默认阈值为 1,000ms。

默认情况下,慢查询会基于 SQL 查询语句(不包含绑定参数)以及查询发生的位置进行分组;不过,如果你只想按 SQL 查询语句分组,也可以选择不捕获位置。

如果你遇到因超长 SQL 查询语句做语法高亮而导致的渲染性能问题,可以添加 without-highlighting prop 来禁用高亮:

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

更多信息请参阅慢查询 recorder文档。

Slow Outgoing Requests

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

默认情况下,条目会按完整 URL 分组。不过,你也可以通过正则表达式对相似的外部请求进行标准化或分组。更多信息请参阅慢外部请求 recorder文档。

Cache

<livewire:pulse.cache /> 卡片会显示应用缓存命中与未命中的统计信息,包括全局统计以及单独 key 的统计。

默认情况下,条目会按 key 分组。不过,你也可以通过正则表达式对相似 key 进行标准化或分组。更多信息请参阅缓存交互 recorder文档。

捕获条目

大多数 Pulse recorder 会基于 Laravel 分发的框架事件自动捕获条目。不过,服务器 recorder以及部分第三方卡片需要定期轮询信息。要使用这些卡片,你必须在所有应用服务器上运行 pulse:check 守护进程:

php
php artisan pulse:check

NOTE

为了让 pulse:check 进程能够长期在后台持续运行,你应使用 Supervisor 之类的进程监控器,确保该命令不会停止运行。

由于 pulse:check 是一个长生命周期进程,因此它在不重启的情况下无法看到代码库中的变更。你应在应用部署过程中调用 pulse:restart 命令,以优雅地重启该命令:

shell
php artisan pulse:restart

NOTE

Pulse 使用 cache 存储重启信号,因此在使用该功能前,你应确认应用已正确配置缓存驱动。

Recorders

Recorder 负责从应用中捕获需要记录到 Pulse 数据库的条目。Recorder 会在 Pulse 配置文件recorders 部分中进行注册和配置。

Cache Interactions

CacheInteractions recorder 会捕获应用中 cache 的命中与未命中信息,用于在 Cache 卡片中显示。

你可以按需调整采样率以及被忽略的 key 模式。

你还可以配置 key 分组,将相似 key 归并成单个条目。例如,你可能希望从缓存同类信息的 key 中移除唯一 ID。分组通过正则表达式进行“查找和替换”配置。配置文件中包含了一个示例:

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

会使用第一个匹配到的模式。如果没有任何模式匹配,则 key 会按原样记录。

Exceptions

Exceptions recorder 会捕获应用中可报告异常的信息,用于在 Exceptions 卡片中显示。

你可以按需调整采样率和被忽略的异常模式。你还可以配置是否捕获异常来源位置。捕获的位置会显示在 Pulse 仪表板中,这有助于追踪异常来源;不过,如果同一个异常在多个位置发生,那么每个唯一位置都会分别显示。

Queues

Queues recorder 会捕获应用队列的信息,用于在 Queues 卡片中显示。

你可以按需调整采样率以及被忽略的任务模式。

Slow Jobs

SlowJobs recorder 会捕获应用中的慢任务信息,用于在 Slow Jobs 卡片中显示。

你可以按需调整慢任务阈值、采样率以及被忽略的任务模式。

有些任务可能天生就会比其他任务耗时更久。在这种情况下,你可以为不同任务配置独立阈值:

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

如果没有正则表达式模式匹配任务类名,则会使用 'default' 值。

Slow Outgoing Requests

SlowOutgoingRequests recorder 会捕获使用 Laravel HTTP 客户端 发出的、超过配置阈值的外部 HTTP 请求信息,用于在 Slow Outgoing Requests 卡片中显示。

你可以按需调整慢外部请求阈值、采样率以及被忽略的 URL 模式。

有些外部请求可能本来就会比其他请求耗时更久。在这种情况下,你可以为不同请求配置独立阈值:

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

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

你还可以配置 URL 分组,将相似 URL 归并成单个条目。例如,你可能希望从 URL 路径中移除唯一 ID,或仅按域名进行分组。分组通过正则表达式进行“查找和替换”配置。配置文件中包含了一些示例:

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

会使用第一个匹配到的模式。如果没有任何模式匹配,则 URL 会按原样记录。

Slow Queries

SlowQueries recorder 会捕获应用中超过配置阈值的数据库查询,用于在 Slow Queries 卡片中显示。

你可以按需调整慢查询阈值、采样率和被忽略的查询模式。你还可以配置是否捕获查询位置。捕获的位置会显示在 Pulse 仪表板中,这有助于追踪查询来源;不过,如果同一条查询在多个位置执行,那么每个唯一位置都会分别显示。

有些查询可能本来就会比其他查询耗时更久。在这种情况下,你可以为不同查询配置独立阈值:

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

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

Slow Requests

Requests recorder 会捕获进入应用的请求信息,用于在 Slow RequestsApplication Usage 卡片中显示。

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

有些请求可能本来就会比其他请求耗时更久。在这种情况下,你可以为不同请求配置独立阈值:

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

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

Servers

Servers recorder 会捕获支撑应用运行的服务器 CPU、内存和存储使用情况,用于在 Servers 卡片中显示。此 recorder 需要你在每台希望监控的服务器上运行 pulse:check 命令

每台上报服务器都必须有唯一名称。默认情况下,Pulse 会使用 PHP gethostname 函数返回的值。如果你想自定义名称,可以设置 PULSE_SERVER_NAME 环境变量:

ini
PULSE_SERVER_NAME=load-balancer

Pulse 配置文件还允许你自定义需要监控的目录。

User Jobs

UserJobs recorder 会捕获应用中分发任务的用户信息,用于在 Application Usage 卡片中显示。

你可以按需调整采样率以及被忽略的任务模式。

User Requests

UserRequests recorder 会捕获应用中发起请求的用户信息,用于在 Application Usage 卡片中显示。

你可以按需调整采样率以及被忽略的 URL 模式。

过滤

正如前面所见,很多 recorder 都支持通过配置,根据某个值(例如请求 URL)“忽略”传入条目。但有时,你可能希望基于其他因素进行过滤,例如当前已认证用户。要过滤这类记录,你可以向 Pulse 的 filter 方法传入一个闭包。通常,filter 方法应在应用 AppServiceProviderboot 方法中调用:

php
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 使用的数据库连接

ini
PULSE_DB_CONNECTION=pulse

Redis Ingest

WARNING

Redis Ingest 要求 Redis 版本至少为 6.2,并且应用配置的 Redis 客户端驱动为 phpredispredis

默认情况下,Pulse 会在 HTTP 响应发送给客户端后,或任务处理完成后,将条目直接存入配置好的数据库连接。不过,你也可以使用 Pulse 的 Redis ingest 驱动,将条目发送到 Redis stream。你可以通过配置 PULSE_INGEST_DRIVER 环境变量启用它:

ini
PULSE_INGEST_DRIVER=redis

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

ini
PULSE_REDIS_CONNECTION=pulse

WARNING

使用 Redis ingest 驱动时,如果你的应用也使用 Redis 队列,那么 Pulse 应始终使用与队列不同的 Redis 连接。

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

php
php artisan pulse:work

NOTE

为了让 pulse:work 进程能够长期在后台持续运行,你应使用 Supervisor 之类的进程监控器,确保 Pulse worker 不会停止运行。

由于 pulse:work 是一个长生命周期进程,因此它在不重启的情况下无法看到代码库中的变更。你应在应用部署过程中调用 pulse:restart 命令,以优雅地重启该命令:

shell
php artisan pulse:restart

NOTE

Pulse 使用 cache 存储重启信号,因此在使用该功能前,你应确认应用已正确配置缓存驱动。

采样

默认情况下,Pulse 会捕获应用中发生的每一个相关事件。对于高流量应用,这可能意味着仪表板需要聚合数百万行数据库记录,特别是在查看较长时间范围时。

你可以选择为某些 Pulse 数据 recorder 启用“采样”。例如,在 User Requests recorder 上将采样率设为 0.1,意味着只记录大约 10% 的请求。在仪表板中,这些值会被按比例放大,并以 ~ 前缀标记,表示它们是近似值。

一般来说,某项指标的条目越多,你就越可以安全地将采样率设低,而不会明显损失准确性。

裁剪

当存储的条目超出仪表板可视时间窗口后,Pulse 会自动裁剪这些条目。裁剪在数据 ingest 时通过抽奖机制触发,而该机制可在 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 卡片,你可以通过在 Livewire 组件上定义一个 css 方法来告诉 Pulse 加载额外的样式表。该方法应返回 CSS 文件路径:

php
class TopSellers extends Card
{
    // ...

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

当这张卡片被包含到仪表板中时,Pulse 会自动将该文件内容注入到 <style> 标签中,因此不需要将其发布到 public 目录。

Tailwind CSS

使用 Tailwind CSS 时,你应创建一个专用 CSS 入口。下面的示例去除了 Tailwind 的 Preflight 基础样式,因为 Pulse 已经内置了这些样式,并通过 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 就能把预聚合值捕获到“bucket”中,以便后续高效检索。

可用的聚合方法有:

  • 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 主要会从预聚合 bucket 中获取数据,因此你所指定的聚合项,必须在前面通过 Pulse::record 方法提前捕获。最旧的 bucket 通常会有一部分超出当前时间范围,因此 Pulse 会对最旧条目做额外聚合来补齐这部分缺口,从而为整个时间段提供准确结果,而无需在每次轮询请求时都重新聚合整段时间的数据。

你也可以使用 aggregateTotal 方法,获取某个 type 的总值。例如,下面的方法会获取所有用户销售额的总和,而不是按用户分组:

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

显示用户

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

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 }}" />

自定义 Recorders

包作者可能希望提供 recorder 类,以便让用户能够配置数据捕获行为。

Recorder 在应用的 config/pulse.php 配置文件的 recorders 部分注册:

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

        // ...
    ],
]

Recorder 可以通过定义 $listen 属性来监听事件。Pulse 会自动注册监听器,并在事件触发时调用 recorder 的 record 方法:

php
<?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(
            // ...
        );
    }
}