Laravel Debounce — це пакет, створений Закарією Актувом, який допомагає уникнути повторного виконання певних дій у визначений період. Це особливо корисно в ситуаціях, коли дія (наприклад, надсилання сповіщення, виконання команди чи відправка завдання) може випадково активуватися кілька разів. Пакет забезпечує виконання лише першого виклику дії протягом зазначеного часу, ефективно "дебаунсуючи" її.
Щоб встановити цей пакет, використайте Composer:
composer require zackaj/laravel-debounce
Ви можете почати дебаунсити існуючі завдання, сповіщення та команди, використовуючи Debounce
фасад без додаткової налаштування. Наприклад:
use Zackaj\LaravelDebounce\Facades\Debounce;
Debounce::job(
job: new GenerateTranscript(),
delay: 5, // у секундах
uniqueKey: auth()->user()->id, // унікальний ключ для кожного класу Job
sync: false, // необов'язково, завдання буде поставлено в чергу
);
Debounce::notification(
notifiables: auth()->user(),
notification: new TranscriptProcessed(),
delay: 5,
uniqueKey: auth()->user()->id,
sendNow: false,
);
Альтернативно, ви можете дебаунсити безпосередньо, використовуючи екземпляри завдань, сповіщень або команд без фасаду.
(new GenerateTranscript())->debounce(...);
(new TranscriptProcessed())->debounce(...);
Також ви можете створити debounceables за допомогою команд Artisan make
. Наприклад:
php artisan make:debounce-job GenerateTranscript
php artisan make:debounce-notification TranscriptProcessed
Для завдання це згенерує приблизно таке:
<?php
namespace App\Jobs;
use Carbon\Carbon;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Queue\Queueable;
use Zackaj\LaravelDebounce\DebounceJob;
class GenerateTranscript extends DebounceJob implements ShouldQueue
{
use Queueable;
/**
* Створити новий екземпляр завдання.
*/
public function __construct()
{
//
}
/**
* Виконати завдання.
*/
public function handle(): void
{
// $this->getReport()->occurrences;
}
public function before(): void
{
// виконати перед відправленням завдання
}
public function after(): void
{
// виконати після відправлення завдання
}
public function getLastActivityTimestamp(): ?Carbon
{
// вручну вказати останню активність для дебаунсу
return null;
}
}
before
/after
дозволяють виконувати код перед і/або після відправлення дебаунсівdebounce:command
. Наприклад: php artisan debounce:command {delay} {uniqueKey} {signature*}
Дізнайтеся більше про цей пакет і перегляньте вихідний код на GitHub.