Laravel Debounce is a package created by Zakaria Aktouf which is designed to prevent the repeated execution of specific actions within a defined timeframe. It is particularly useful in situations where an action (e.g., sending a notification, running a command, or job dispatch) might be triggered multiple times unintentionally. The package ensures that only the first invocation of the action within a specified period is executed, effectively debouncing the action.
To install this package use composer:
composer require zackaj/laravel-debounce
You can then start debouncing existing jobs, notifications and commands using the Debounce
Facade without any additional setup. For example:
use Zackaj\LaravelDebounce\Facades\Debounce; Debounce::job( job: new GenerateTranscript(), delay: 5, // in seconds uniqueKey: auth()->user()->id, // debounce per Job class name + uniqueKey sync: false, // Optional, job will be fired to the queue); Debounce::notification( notifiables: auth()->user(), notification: new TranscriptProcessed(), delay: 5, uniqueKey: auth()->user()->id, sendNow: false,);
Alternatively, you can debounce directly from the job, notification or command instances without using a facade.
(new GenerateTranscript())->debounce(...); (new TranscriptProcessed())->debounce(...);
You can also generate debounceables using Artisan make
commands. For example:
php artisan make:debounce-job GenerateTranscriptphp artisan make:debounce-notification TranscriptProcessed
which for a Job would generate something like:
<?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; /** * Create a new job instance. */ public function __construct() { // } /** * Execute the job. */ public function handle(): void { // $this->getReport()->occurrences; } public function before(): void { //run before dispatching the job } public function after(): void { //run after dispatching the job } public function getLastActivityTimestamp(): ?Carbon { //manually set the last activity to debounce from return null; }}
Other Key Features
- Report Tracking with information like the ip address and authenticated user per request
before
/after
Hooks allow you to run some code before and/or after firing the debounceables- Debounce from custom timestamp
- Integrates with Laravel Telescope so you can see the debouncer live in the queues tab and to debug any failures
- Debounce commands from the CLI using the
debounce:command
Artisan command. e.g.php artisan debounce:command {delay} {uniqueKey} {signature*}
Learn more about this package and view the source code on Github.