主题
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>每张卡片都接受 cols 和 rows prop,用来控制占用空间和布局位置:
blade
<livewire:pulse.usage cols="4" rows="2" />大多数卡片还接受一个 expand prop,以显示完整卡片而不是滚动内容:
blade
<livewire:pulse.slow-queries expand />解析用户
对于会显示用户信息的卡片,例如 Application Usage 卡片,Pulse 只会记录用户的 ID。在渲染仪表板时,Pulse 会从默认的 Authenticatable 模型中解析 name 和 email 字段,并通过 Gravatar Web 服务显示头像。
你可以在应用的 App\Providers\AppServiceProvider 类中调用 Pulse::user 方法,自定义字段和头像。
user 方法接收一个闭包。闭包会接收要显示的 Authenticatable 模型,并应返回一个数组,其中包含用户的 name、extra 和 avatar 信息:
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 hour 或 3 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:checkNOTE
为了让 pulse:check 进程能够长期在后台持续运行,你应使用 Supervisor 之类的进程监控器,确保该命令不会停止运行。
由于 pulse:check 是一个长生命周期进程,因此它在不重启的情况下无法看到代码库中的变更。你应在应用部署过程中调用 pulse:restart 命令,以优雅地重启该命令:
shell
php artisan pulse:restartNOTE
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 Requests 和 Application 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-balancerPulse 配置文件还允许你自定义需要监控的目录。
User Jobs
UserJobs recorder 会捕获应用中分发任务的用户信息,用于在 Application Usage 卡片中显示。
你可以按需调整采样率以及被忽略的任务模式。
User Requests
UserRequests recorder 会捕获应用中发起请求的用户信息,用于在 Application Usage 卡片中显示。
你可以按需调整采样率以及被忽略的 URL 模式。
过滤
正如前面所见,很多 recorder 都支持通过配置,根据某个值(例如请求 URL)“忽略”传入条目。但有时,你可能希望基于其他因素进行过滤,例如当前已认证用户。要过滤这类记录,你可以向 Pulse 的 filter 方法传入一个闭包。通常,filter 方法应在应用 AppServiceProvider 的 boot 方法中调用:
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=pulseRedis Ingest
WARNING
Redis Ingest 要求 Redis 版本至少为 6.2,并且应用配置的 Redis 客户端驱动为 phpredis 或 predis。
默认情况下,Pulse 会在 HTTP 响应发送给客户端后,或任务处理完成后,将条目直接存入配置好的数据库连接。不过,你也可以使用 Pulse 的 Redis ingest 驱动,将条目发送到 Redis stream。你可以通过配置 PULSE_INGEST_DRIVER 环境变量启用它:
ini
PULSE_INGEST_DRIVER=redis默认情况下,Pulse 会使用默认的 Redis 连接,不过你也可以通过 PULSE_REDIS_CONNECTION 环境变量进行自定义:
ini
PULSE_REDIS_CONNECTION=pulseWARNING
使用 Redis ingest 驱动时,如果你的应用也使用 Redis 队列,那么 Pulse 应始终使用与队列不同的 Redis 连接。
使用 Redis ingest 时,你需要运行 pulse:work 命令来监听 stream,并将条目从 Redis 移动到 Pulse 的数据库表中。
php
php artisan pulse:workNOTE
为了让 pulse:work 进程能够长期在后台持续运行,你应使用 Supervisor 之类的进程监控器,确保 Pulse worker 不会停止运行。
由于 pulse:work 是一个长生命周期进程,因此它在不重启的情况下无法看到代码库中的变更。你应在应用部署过程中调用 pulse:restart 命令,以优雅地重启该命令:
shell
php artisan pulse:restartNOTE
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 组件会自动提供一个占位符,并尊重传入组件的 cols 和 rows 属性。
在编写 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);
}你还需要在卡片视图中加入一个 id 或 class 属性,并与入口文件中的 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”中,以便后续高效检索。
可用的聚合方法有:
avgcountmaxminsum
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 }}
@endforeachPulse 主要会从预聚合 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 方法返回的对象包含 name、extra 和 avatar 键,你也可以直接把它传给 <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(
// ...
);
}
}