1. Go to this page and download the library: Download zackaj/laravel-debounce library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
zackaj / laravel-debounce example snippets
namespace App\Notifications;
use App\Models\File;
use Illuminate\Bus\Queueable;
use Illuminate\Notifications\Notification;
class FileUploaded extends Notification
{
use Queueable;
public function __construct(public File $file) {}
public function via(object $notifiable): array
{
return ['database'];
}
public function toArray(object $notifiable): array
{
return [
'files' => $this->file->user->files()
->where('created_at', '>=', $this->file->created_at)
->get(),
];
}
}
namespace App\Http\Controllers;
use App\Models\File;
use App\Models\User;
use App\Notifications\FileUploaded;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Notification;
use Zackaj\LaravelDebounce\Facades\Debounce;
class DemoController extends Controller
{
public function normalNotification(Request $request)
{
$user = $request->user();
$file = File::factory()->create(['user_id' => $user->id]);
$otherUsers = User::query()->whereNot('id', $user->id)->get();
Notification::send($otherUsers, new FileUploaded($file));
return back();
}
public function debounceNotification(Request $request)
{
$user = $request->user();
$file = File::factory()->create(['user_id' => $user->id]);
$otherUsers = User::query()->whereNot('id', $user->id)->get();
Debounce::notification(
notifiables: $otherUsers,
notification:new FileUploaded($file),
delay: 5,
uniqueKey:$user->id,
);
return back();
}
}
return [
/*
* When set to false, debouncing is bypassed entirely and jobs, notifications
* and commands are fired immediately as if debounce was never called.
*/
'enabled' => env('LARAVEL_DEBOUNCE_ENABLED', true),
'driver' => 'cache', // the only supported driver for now
];
use Zackaj\LaravelDebounce\Facades\Debounce;
//job
Debounce::job(
job:new Job(),//replace
delay:5,//delay in seconds
uniqueKey:auth()->user()->id,//debounce per Job class name + uniqueKey
sync:false, //optional, job will be fired to the queue
);
//notification
Debounce::notification(
notifiables: auth()->user(),
notification: new Notification(),//replace
delay: 5,
uniqueKey: auth()->user()->id,
sendNow: false,
);
//command
Debounce::command(
command: 'app:command',//replace
delay: 5,
uniqueKey: $request->ip(),
parameters: ['name' => 'zackaj'],//see Artisan::call() signature
toQueue: false,//optional, send command to the queue when executed
outputBuffer: null,//optional, //see Artisan::call() signature
);
use Zackaj\LaravelDebounce\DebounceJob;
use Zackaj\LaravelDebounce\DebounceNotification;
use Zackaj\LaravelDebounce\DebounceCommand;
(new Job())->debounce(...);
(new Notification())->debounce(...);
(new Command())->debounce(...);
namespace App\Jobs;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Zackaj\LaravelDebounce\DebounceJob;
class Jobless extends DebounceJob implements ShouldQueue
{
use Dispatchable;
public function handle(): void
{
$this->getReport()->occurrences;//collection of occurrences
$this->getReport()->occurrences->count();
$this->getReport()->occurrences->first()->happenedAt;
$this->getReport()->occurrences->first()->ip;
$this->getReport()->occurrences->first()->ips;
$this->getReport()->occurrences->first()->requestHeaders;//HeaderBag
$this->getReport()->occurrences->first()->user;//authenticated user | null
}
}
...
class Jobless extends DebounceJob implements ShouldQueue
{
...
public function before(): void
{
//run before dispatching the job
}
public function after(): void
{
//run after dispatching the job
}
}
...
class FileUploaded extends DebounceNotification
{
...
public function before($notifiables): void
{
//run before sending the notification
}
public function after($notifiables): void
{
//run after sending the notification
}
}
...
class Test extends DebounceCommand
{
...
public static function before(): void
{
//run before executing the command
}
public static function after(): void
{
//run after executing the command
}
}
public function getLastActivityTimestamp(): ?Carbon
{
return $this->getReport()->occurrences->last()->happenedAt;
}
...
class Jobless extends DebounceJob implements ShouldQueue
{
...
public function getLastActivityTimestamp(): ?Carbon
{
return Message::latest()->first()?->seen_at;
}
}
...
class FileUploaded extends DebounceNotification
{
...
public function getLastActivityTimestamp(mixed $notifiables): ?Carbon
{
return $this->file->user->files->latest()->first()?->created_at;
}
}
...
class Test extends DebounceCommand
{
...
public static function getLastActivityTimestamp(): ?Carbon
{
return User::latest()->first()?->created_at;
}
}
public function test_something()
{
config(['debounce.enabled' => false]);
// debouncing is bypassed, everything fires immediately
}