跳到内容

Laravel Pulse

简介

Laravel Pulse 提供关于应用程序性能和使用情况的概览洞察。使用 Pulse,您可以追踪瓶颈,例如慢速作业和端点,找到最活跃的用户等等。

要进行个人事件的深入调试,请查看 Laravel Telescope

安装

Pulse 的第一方存储实现目前需要 MySQL、MariaDB 或 PostgreSQL 数据库。如果您正在使用不同的数据库引擎,您将需要一个单独的 MySQL、MariaDB 或 PostgreSQL 数据库用于您的 Pulse 数据。

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

1composer require laravel/pulse

接下来,您应该使用 vendor:publish Artisan 命令发布 Pulse 配置文件和迁移文件

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

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

1php artisan migrate

一旦 Pulse 的数据库迁移运行完毕,您就可以通过 /pulse 路由访问 Pulse 仪表盘。

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

配置

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

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

仪表盘

授权

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

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

自定义

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

1php 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>

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

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

大多数卡片还接受 expand 属性以显示完整卡片而不是滚动

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

解析用户

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

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

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

1use Laravel\Pulse\Facades\Pulse;
2 
3/**
4 * Bootstrap any application services.
5 */
6public 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 仪表盘中显示非活动服务器。您可以使用 ignore-after 属性来完成此操作,该属性接受非活动服务器应从 Pulse 仪表盘中删除的秒数。或者,您可以提供相对时间格式的字符串,例如 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,000 毫秒。有关更多信息,请参阅慢速请求记录器文档。

慢速作业

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

慢速查询

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

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

如果您遇到由于接收语法高亮的超大型 SQL 查询而导致的渲染性能问题,您可以添加 without-highlighting 属性来禁用高亮显示

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

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

慢速出站请求

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

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

缓存

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

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

捕获条目

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

1php artisan pulse:check

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

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

1php artisan pulse:restart

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

记录器

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

缓存交互

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

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

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

1Recorders\CacheInteractions::class => [
2 // ...
3 'groups' => [
4 // '/:\d+/' => ':*',
5 ],
6],

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

异常

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

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

队列

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

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

慢速作业

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

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

您可能有一些作业,您期望它们比其他作业花费更长的时间。在这些情况下,您可以配置每个作业的阈值

1Recorders\SlowJobs::class => [
2 // ...
3 'threshold' => [
4 '#^App\\Jobs\\GenerateYearlyReports$#' => 5000,
5 'default' => env('PULSE_SLOW_JOBS_THRESHOLD', 1000),
6 ],
7],

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

慢速出站请求

SlowOutgoingRequests 记录器捕获有关使用 Laravel 的 HTTP 客户端 发出的、超出配置阈值的出站 HTTP 请求的信息,以便在 慢速出站请求 卡片上显示。

您可以选择调整慢速出站请求阈值、采样率和忽略的 URL 模式。

您可能有一些出站请求,您期望它们比其他请求花费更长的时间。在这些情况下,您可以配置每个请求的阈值

1Recorders\SlowOutgoingRequests::class => [
2 // ...
3 'threshold' => [
4 '#backup.zip$#' => 5000,
5 'default' => env('PULSE_SLOW_OUTGOING_REQUESTS_THRESHOLD', 1000),
6 ],
7],

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

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

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

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

慢速查询

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

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

您可能有一些查询,您期望它们比其他查询花费更长的时间。在这些情况下,您可以配置每个查询的阈值

1Recorders\SlowQueries::class => [
2 // ...
3 'threshold' => [
4 '#^insert into `yearly_reports`#' => 5000,
5 'default' => env('PULSE_SLOW_QUERIES_THRESHOLD', 1000),
6 ],
7],

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

慢速请求

Requests 记录器捕获有关向您的应用程序发出的请求的信息,以便在慢速请求应用程序使用情况卡片上显示。

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

您可能有一些请求,您期望它们比其他请求花费更长的时间。在这些情况下,您可以配置每个请求的阈值

1Recorders\SlowRequests::class => [
2 // ...
3 'threshold' => [
4 '#^/admin/#' => 5000,
5 'default' => env('PULSE_SLOW_REQUESTS_THRESHOLD', 1000),
6 ],
7],

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

服务器

Servers 记录器捕获驱动应用程序的服务器的 CPU、内存和存储使用情况,以便在服务器卡片上显示。此记录器需要pulse:check 命令在您希望监视的每个服务器上运行。

每个报告服务器都必须具有唯一的名称。默认情况下,Pulse 将使用 PHP 的 gethostname 函数返回的值。如果您希望自定义此名称,可以设置 PULSE_SERVER_NAME 环境变量

1PULSE_SERVER_NAME=load-balancer

Pulse 配置文件还允许您自定义要监视的目录。

用户作业

UserJobs 记录器捕获有关在您的应用程序中调度作业的用户的信息,以便在应用程序使用情况卡片上显示。

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

用户请求

UserRequests 记录器捕获有关向您的应用程序发出请求的用户的信息,以便在应用程序使用情况卡片上显示。

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

过滤

正如我们所见,许多记录器都提供了通过配置来“忽略”传入条目的能力,例如请求的 URL。但是,有时根据其他因素(例如当前经过身份验证的用户)过滤掉记录可能很有用。要过滤掉这些记录,您可以将闭包传递给 Pulse 的 filter 方法。通常,filter 方法应在应用程序的 AppServiceProviderboot 方法中调用

1use Illuminate\Support\Facades\Auth;
2use Laravel\Pulse\Entry;
3use Laravel\Pulse\Facades\Pulse;
4use Laravel\Pulse\Value;
5 
6/**
7 * Bootstrap any application services.
8 */
9public function boot(): void
10{
11 Pulse::filter(function (Entry|Value $entry) {
12 return Auth::user()->isNotAdmin();
13 });
14 
15 // ...
16}

性能

Pulse 旨在无需任何其他基础设施即可融入现有应用程序。但是,对于高流量应用程序,有多种方法可以消除 Pulse 可能对应用程序性能产生的任何影响。

使用不同的数据库

对于高流量应用程序,您可能更喜欢为 Pulse 使用专用数据库连接,以避免影响应用程序数据库。

您可以通过设置 PULSE_DB_CONNECTION 环境变量来自定义 Pulse 使用的数据库连接

1PULSE_DB_CONNECTION=pulse

Redis 摄取

Redis 摄取需要 Redis 6.2 或更高版本,并且需要 phpredispredis 作为应用程序配置的 Redis 客户端驱动程序。

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

1PULSE_INGEST_DRIVER=redis

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

1PULSE_REDIS_CONNECTION=pulse

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

1php artisan pulse:work

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

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

1php artisan pulse:restart

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

抽样

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

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

一般来说,对于特定指标,您的条目越多,您可以安全地设置较低的采样率,而不会牺牲太多准确性。

修剪

Pulse 会自动修剪其存储的条目,一旦它们超出仪表盘窗口。修剪发生在摄取数据时,使用彩票系统,该系统可以在 Pulse 配置文件中自定义。

处理 Pulse 异常

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

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

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

自定义卡片

Pulse 允许您构建自定义卡片,以显示与您的应用程序特定需求相关的数据。Pulse 使用 Livewire,因此您可能需要在构建您的第一个自定义卡片之前查看其文档

卡片组件

在 Laravel Pulse 中创建自定义卡片首先要扩展基本的 Card Livewire 组件并定义相应的视图

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

当使用 Livewire 的 延迟加载 功能时,Card 组件将自动提供一个占位符,该占位符会考虑传递给您的组件的 colsrows 属性。

在编写 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 
8 <x-pulse::scroll :expand="$expand">
9 ...
10 </x-pulse::scroll>
11</x-pulse::card>

$cols$rows$class$expand 变量应传递给它们各自的 Blade 组件,以便可以从仪表盘视图自定义卡片布局。您可能还希望在视图中包含 wire:poll.5s="" 属性,以使卡片自动更新。

一旦您定义了 Livewire 组件和模板,就可以将卡片包含在您的仪表盘视图

1<x-pulse>
2 ...
3 
4 <livewire:pulse.top-sellers cols="4" />
5</x-pulse>

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

样式

如果您的卡片除了 Pulse 包含的类和组件之外还需要其他样式,则有几种选项可用于为您的卡片包含自定义 CSS。

Laravel Vite 集成

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

1laravel({
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 ...
5</x-pulse>

CSS 文件

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

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

当此卡片包含在仪表盘上时,Pulse 将自动将此文件的内容包含在 <style> 标记中,因此无需将其发布到 public 目录。

Tailwind CSS

当使用 Tailwind CSS 时,您应该创建一个专用的 Tailwind 配置文件,以避免加载不必要的 CSS 或与 Pulse 的 Tailwind 类冲突

1export 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;

您还需要在卡片的视图中包含一个 idclass 属性,该属性与传递给 Tailwind 的 important 选择器策略 的选择器匹配

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

数据捕获和聚合

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

捕获条目

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

1use Laravel\Pulse\Facades\Pulse;
2 
3Pulse::record('user_sale', $user->id, $sale->amount)
4 ->sum()
5 ->count();

提供给 record 方法的第一个参数是您正在记录的条目的 type,而第二个参数是确定应如何分组聚合数据的 key。对于大多数聚合方法,您还需要指定要聚合的 value。在上面的示例中,要聚合的值是 $sale->amount。然后,您可以调用一个或多个聚合方法(例如 sum),以便 Pulse 可以将预聚合值捕获到“buckets”中,以便以后高效检索。

可用的聚合方法有

  • avg(平均值)
  • count(计数)
  • max(最大值)
  • min(最小值)
  • sum(总和)

当构建一个卡片包来捕获当前已认证的用户 ID 时,你应该使用 Pulse::resolveAuthenticatedUserId() 方法,该方法会遵循应用于应用程序的任何 用户解析器自定义

检索聚合数据

当扩展 Pulse 的 Card Livewire 组件时,你可以使用 aggregate 方法来检索仪表盘中当前查看期间的聚合数据

1class 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}

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

1@foreach ($topSellers as $seller)
2 {{ $seller->key }}
3 {{ $seller->sum }}
4 {{ $seller->count }}
5@endforeach

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

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

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

显示用户

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

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

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 ],
10]

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

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

Laravel 是最高效的方式来
构建、部署和监控软件。