timacdonald / pulse-validation-errors
Laravel Pulse 的验证错误卡片
v1.5.1
2024-06-26 02:54 UTC
Requires
- php: ^8.1
- laravel/pulse: ^1.2
Requires (Dev)
- inertiajs/inertia-laravel: ^1.0
- orchestra/testbench: ^9.0
- phpunit/phpunit: ^10.0 || ^11.0
README
一个用于显示影响用户的验证错误的 Laravel Pulse 卡片。
安装
首先,通过 composer 安装此包
composer require timacdonald/pulse-validation-errors
然后,将记录器添加到您的 config/pulse.php
return [ // ... 'recorders' => [ TiMacDonald\Pulse\Recorders\ValidationErrors::class => [ 'enabled' => env('PULSE_VALIDATION_ERRORS_ENABLED', true), 'sample_rate' => env('PULSE_VALIDATION_ERRORS_SAMPLE_RATE', 1), 'capture_messages' => true, 'ignore' => [ // '#^/login$#', // '#^/register$#', // '#^/forgot-password$#', ], 'groups' => [ // '#^/products/.*$#' => '/products/{user}', ], ], // ... ], ];
然后,将卡片添加到您的 resources/views/vendor/pulse/dashboard.php
<x-pulse> <livewire:pulse.validation-errors cols="8" rows="4" /> <!-- ... --> </x-pulse>
最后,开始提高您的用户体验。在 LaraconUS 上,我谈到了我们验证有多糟糕的演讲。如果您在这里,您可能也关心您的用户在您的应用中体验验证错误的方式,所以我希望您能看看这个视频。
功能
- 支持基于会话的验证错误
- 支持 API 验证错误
- 支持 Inertia 验证错误
- 支持 Livewire 验证错误
- 支持多个错误包
- 不可检测的验证错误的回退(基于 422 响应状态)
- 捕获自定义响应类型的验证异常
忽略特定错误消息
您可以通过记录器的 ignore
键忽略特定端点,但是在某些情况下,您可能需要更复杂的忽略规则。您可以使用 Pulse 内置的 Pulse::filter
方法 来实现这一点。
以下是一个忽略特定错误消息的示例
use Laravel\Pulse\Entry; use Laravel\Pulse\Facades\Pulse; use Laravel\Pulse\Value; /** * Bootstrap any application services. */ public function boot(): void { Pulse::filter(fn ($entry): bool => match ($entry->type) { 'validation_error' => ! Str::contains($entry->key, [ 'The password is incorrect.', 'Your password has appeared in a data leak.', // ... ]), // ... default => true, }); }
捕获自定义响应格式的验证错误
如果您返回自定义响应格式,您可能会在仪表板中看到 __laravel_unknown
而不是输入名称和错误消息。这是因为该包解析响应体以确定验证错误。当体处于不可识别的格式时,它无法从响应中解析键和消息。
相反,您应该分发 ValidationExceptionOccurred
事件,将验证消息传递给卡片的记录器。您可以在将异常转换为响应的任何地方这样做。这通常发生在 app/Exceptions/Handler
中。
<?php namespace App\Exceptions\Handler; use Illuminate\Support\Facades\Event; use Illuminate\Validation\ValidationException; use Laravel\Pulse\Facades\Pulse; use Throwable; use TiMacDonald\Pulse\ValidationExceptionOccurred class Handler { // ... public function render($request, Throwable $e) { if ($e instanceof ValidationException) { Pulse::rescue(fn () => Event::dispatch(new ValidationExceptionOccurred($request, $e))); } // custom exception rendering logic... } }