timacdonald/pulse-validation-errors

Laravel Pulse 的验证错误卡片

v1.5.1 2024-06-26 02:54 UTC

This package is auto-updated.

Last update: 2024-08-26 22:53:07 UTC


README

一个用于显示影响用户的验证错误的 Laravel Pulse 卡片。

Validation errors card for 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...
    }
}