Дебаунс у Laravel: як підвищити ефективність вашої аплікації

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 15 січня, 2025
Занепокоєні багатократним виконанням дій у Laravel? Досліджуйте пакет Laravel Debounce, створений Закарією Актофом, який допоможе вам уникнути непотрібних повторень та оптимізувати виконання завдань. Читайте далі, щоб дізнатися, як легко інтегрувати цю функцію у вашому проєкті

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;
    }
}

# Інші ключові можливості

Дізнайтеся більше про цей пакет і перегляньте вихідний код на GitHub.