Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 17 липня 2026

Laravel Cooldown: пакет для контролю часових інтервалів між діями

Laravel Cooldown - це пакет від Mahedi Zaman Zaber, який дозволяє встановлювати часове блокування на іменовані дії. Якщо RateLimiter Laravel підраховує кількість запитів до ендпоінту в межах часового вікна, то Cooldown відстежує, чи конкретна дія для конкретного власника все ще перебуває в періоді очікування, і може зберігати цей стан у базі даних, а не лише в кеші.

Основні можливості

Пакет пропонує широкий набір функцій для роботи з часовими блокуваннями:

  • Дії з прив'язкою до власника через Cooldown::for('resend_verification', $user), де власником може бути будь-яка модель, IP-адреса у вигляді рядка або відсутність власника для глобального блокування
  • Трейт HasCooldowns, який додає метод $user->cooldown('change_avatar') до будь-якої Eloquent-моделі
  • Middleware для маршрутів у форматі cooldown:action,duration з опціональним аргументом драйвера
  • Атомарне виконання через block(), який встановлює блокування навколо callback-функції та активує cooldown лише у разі успіху
  • Метод enforce() для викидання CooldownActiveException, яке рендериться як HTTP 429
  • Незмінний об'єкт CooldownInfo з методами remainingSeconds() та remainingForHumans()
  • Бекенди cache або database, які можна перемикати для кожного виклику через using()
  • Очищення застарілих записів бази даних через команду Laravel model:prune

Fluent API

Cooldown складається з іменованої дії, опціонального власника та тривалості. Після визначення можна встановлювати, перевіряти або скидати блокування:

use ZaberDev\Cooldown\Facades\Cooldown;
Cooldown::for('rebuild_search_index')->for(600);
Cooldown::for('resend_verification', $user)->for(900);
Cooldown::for('daily_checkin', $user)->until(now()->endOfDay());

Коли cooldown активний, метод info() повертає об'єкт з деталями тривалості:

if (Cooldown::for('resend_verification', $user)->active()) {
    $info = Cooldown::for('resend_verification', $user)->info();
    echo "Please wait " . $info->remainingForHumans() . " before requesting another email.";
    echo "Seconds remaining: " . $info->remainingSeconds();
}

Якщо потрібно зупинити запит замість розгалуження логіки, enforce() викидає виключення, коли дія все ще заблокована:

Cooldown::for('request_password_reset', $user)->enforce();

Атомарне блокування

Cooldown створений саме для ситуацій на кшталт відправки OTP або списання коштів з картки, коли два одночасні запити можуть пройти перевірку до того, як будь-який з них встановить блокування. Метод block() вирішує цю проблему, отримуючи lock, виконуючи callback і застосовуючи cooldown лише у разі успішного виконання:

Cooldown::for('send_login_code', $user)->block(function () use ($smsClient, $user) {
    $smsClient->sendCode($user->phone);
}, duration: 90);

Якщо потрібно управляти блокуванням власноруч, доступні методи acquireLock() та releaseLock().

Cooldown на Eloquent-моделях

Додайте трейт HasCooldowns, і той самийBuilder буде доступний на екземплярі моделі з автоматичною прив'язкою до запису:

use ZaberDev\Cooldown\HasCooldowns;

class User extends Authenticatable
{
    use HasCooldowns;
}

Використання:

$user->cooldown('change_avatar')->for(300);

if ($user->cooldown('change_avatar')->active()) {
    return response()->json(['message' => 'You can change your avatar again shortly.'], 429);
}

$user->cooldown('change_avatar')->reset();

При використанні database-бекенду записи є поліморфними, тому cooldown моделі можна запитувати як будь-яке інше відношення:

$activeCooldowns = $user->cooldowns()->where('expires_at', '>', now())->get();
$user->cooldowns()->delete();

Middleware для маршрутів

Middleware cooldown приймає назву дії, тривалість у секундах та опціональний драйвер:

Route::post('/feedback', [FeedbackController::class, 'store'])
    ->middleware('cooldown:submit_feedback,120');

Route::post('/invoices/export', [InvoiceController::class, 'export'])
    ->middleware('cooldown:invoice_export,600,database');

Бекенди для зберігання

За замовчуванням використовується драйвер cache, що базується на налаштованому сховищі, тому працюють і Redis, і Memcached. Драйвер database натомість записує дані в таблицю cooldowns, що корисно, коли блокування пов'язане з критичними операціями на кшталт біллінгу і не може бути видалене під час очищення кешу. Драйвер можна вибирати для кожного виклику:

Cooldown::for('poll_job_status', $ip)->using('cache')->for(20);
Cooldown::for('renew_subscription', $user)->using('database')->for(86400);

Якщо потрібне інше сховище, Cooldown::extend() дозволяє зареєструвати власний драйвер із service provider. Застарілі записи бази даних можна очищати за розкладом командою Laravel model:prune.

Встановлення

Пакет вимагає PHP 8.2 і підтримує Laravel 11, 12 та 13:

composer require zaber-dev/laravel-cooldown
php artisan vendor:publish --provider="ZaberDev\Cooldown\CooldownServiceProvider"
php artisan migrate

Файл config/cooldown.php встановлює драйвер за замовчуванням (COOLDOWN_DRIVER), сховище кешу та префікс ключів, назву таблиці бази даних та чи відправляються події.

Інструкції з встановлення та повну документацію можна знайти на GitHub.

19

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Filament v5.10.0
Новини 12 жовтня 2026

Filament v5.10.0: сітка в rich editor, скелетони таблиць і десятки виправлень

Вийшов Filament v5.10.0: елементи керування сіткою в rich editor, допоміжний контент для віджетів-графіків, скелетони завантаження таблиць, submitOnCompletion() для OneTimeCodeInput та багато виправлень авторизації, доступності й стану.

17
Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

12

Вакансії за темою

Z Global E-Commerce
16 днів тому

Full-Stack Developer (PHP/Laravel + Vue 3)

Full-Stack розробник з глибоким досвідом бекенду. Розробляєте масштабовані веб-платформи з комплексною бізнес-логікою, працюєте з PHP/Laravel, SQL, Vue 3/TypeScript. Основні вимоги: досвід з Laravel, Eloquent, проектування API, оптимізація баз даних (включно з мільйонами записів), фронтенд на Vue 3 з Composition API, TypeScript. Цінується розуміння архітектури, продуктивності й довгострокової підтримуваності коду.

Wooden Sword
17 днів тому

Senior PHP Developer (Game Backend)

Розробник backend для мобільної RPG з високим навантаженням. Основний стек: PHP Laravel API та TypeScript Nakama Game Server. Відповідальність за повний цикл розробки функцій — від логіки до тестування, code review, оптимізації та документації. Вимоги: 5+ років backend-досвіду, бездоганне знання Laravel/PHP, сильні навички TypeScript, PostgreSQL та асинхронного програмування.

Kredyt Kapital
17 днів тому

Middle Full-Stack Developer (PHP / Laravel / Vue / React)

Middle Full-Stack Developer для розробки внутрішніх IT-продуктів. Основний стек: PHP 8.3+, Laravel, PostgreSQL, REST API, Vue.js/React. Розробник займатиметься backend (бізнес-логіка, Eloquent, Jobs/Queues) і frontend (компоненти, інтерфейси), інтеграціями та оптимізацією. Вимоги: 2-3+ років комерційного досвіду з PHP, 2+ років практики з Laravel, впевнене знання PostgreSQL, Git, JavaScript ES6+.

Пакети за темою

Laravel Usage Limiter

nabilhassen/laravel-usage-limiter

Пакет для управління та обмеження використання функцій за планами, користувачами або іншими моделями в Laravel додатках.

187 v2.0.0 13 7

Bagisto

bagisto/bagisto

Bagisto — це платформа для електронної комерції, побудована на Laravel. Вона надає готове рішення для створення та управління інтернет-магазинами з підтримкою каталогу товарів, замовлень, платежів та клієнтів.

28,228 v2.5.0 13 26