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

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

Laravel Quota - це пакет для відстеження та контролю накопичувальних лімітів споживання ресурсів. Наприклад, ви можете встановити обмеження на 50 PDF-експортів на місяць, 1000 API-запитів на день, пул AI-кредитів на розрахунковий період тощо.

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

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

Пакет надає наступний функціонал:

  • Періоди, вирівняні за календарем - можна визначити perMinute(), perHour(), perDay(), perWeek(), perMonth(), perYear() або period($start, $end) для довільного вікна
  • Трейт HasQuotas, який додає квоти до будь-якої Eloquent-моделі
  • Middleware для роутів (quota:exports,50,month), який списує квоту лише при успішній відповіді
  • Бекенди на базі кешу або бази даних, які можна перемикати для кожного виклику
  • Атомарне споживання - блокування споживання навколо роботи, яку воно вимірює
  • Примусове дотримання бюджетів - викидає HTTP 429, коли бюджет вичерпано

Fluent API

Квота - це іменований лічильник, прив'язаний до власника, з лімітом і періодом. Після визначення квоти ви можете перевіряти її стан або витрачати:

use ZaberDev\Quota\Facades\Quota;

$builder = Quota::for('api_queries', $user)
    ->limit(1000)
    ->perDay();

$builder->used();
$builder->remaining();
$builder->isExceeded();
$builder->hasCapacity(10);

$info = $builder->consume(5);

Метод consume() повертає незмінний DTO QuotaInfo. Якщо ви хочете жорсткої помилки замість розгалуження логіки, метод enforce() викидає HTTP 429, коли бюджет вичерпано:

Quota::for('api_queries', $user)->limit(1000)->perDay()->enforce();

Для операцій, де подвійне списання справді має значення, метод block() обгортає callback у блокування, щоб два одночасні запити не могли обидва пройти перевірку доступної ємності:

Quota::for('pdf_generation', $user)
    ->limit(50)
    ->perMonth()
    ->block(function () use ($pdfService) {
        $pdfService->generate();
    }, amount: 1, lockSeconds: 30);

Квоти на Eloquent-моделях

Додайте трейт HasQuotas, і той самий builder стане доступний через модель:

use ZaberDev\Quota\HasQuotas;

class User extends Authenticatable
{
    use HasQuotas;
}
$user->quota('pdf_exports')->limit(25)->perMonth()->consume();
$user->quota('pdf_exports')->limit(25)->perMonth()->remaining();

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

$activeQuotas = $user->quotas()
    ->where('period_end', '>', now())
    ->get();

Middleware для роутів

Middleware quota приймає назву, ліміт, період і опціональний драйвер:

Route::post('/exports/generate', [ExportController::class, 'store'])
    ->middleware('quota:exports,50,month');

Route::post('/api/v1/query', [ApiController::class, 'query'])
    ->middleware('quota:api_query,1000,day,database');

Важливо відзначити порядок виконання: доступна ємність перевіряється до запуску роуту, але квота списується лише тоді, коли повертається відповідь 2xx або 3xx. Запит, який завершується помилкою 500 або не проходить валідацію, не коштує користувачу нічого.

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

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

Quota::for('api_ping', $ip)->using('cache')->limit(5000)->perDay()->consume();
Quota::for('monthly_exports', $user)->using('database')->limit(50)->perMonth()->consume();

Метод Quota::extend() дозволяє зареєструвати власний бекенд з сервіс-провайдера, якщо вам потрібно інше місце для зберігання лічильників. Застарілі записи бази даних можна очищати за розкладом:

use ZaberDev\Quota\Models\Quota;

Schedule::command('model:prune', ['--model' => Quota::class])->daily();

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

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

composer require zaber-dev/laravel-quota
php artisan vendor:publish --provider="ZaberDev\Quota\QuotaServiceProvider"
php artisan migrate

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

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

13

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

Коментарі

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

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

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

Новини 27 жовтня 2026

Filament v5.11.0: поля й віджети на React, Vue і Svelte та жорсткіший захист Livewire

Filament v5.11.0 дозволяє писати власні поля форм, компоненти схем і віджети на React, Vue, Svelte або чистому JavaScript. Паралельно v5.11.0 і v4.16.0 закривають для клієнта внутрішні Livewire-методи та стан і додають опційні ліміти для репітерів і пагінації таблиць.

2
Новини 27 жовтня 2026

Livewire 4.4.8 закриває обхід #[Authorize], а NativePHP Mobile - сім вразливостей

Livewire 4.4.8 виправляє GHSA-mhf7-xp6r-6qrc (CVSS 6.5): атрибут #[Authorize] можна було обійти й виконати дію над чужим записом. Того ж тижня NativePHP опублікувала сім попереджень для NativePHP for Mobile - виправлення в nativephp/mobile 4.6.1 і 3.3.11, але до користувачів вони дійдуть лише з новою збіркою застосунку.

1

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

Intetics
7 днів тому

Senior Full-Stack PHP Developer (Laravel + React/Vue)

Senior Full-Stack PHP розробник створює й підтримує масштабовані веб-застосунки: бекенд на Laravel та фронтенд на React або Vue. Відповідає за архітектурні рішення (дизайн сервісів, моделювання даних, кешування, черги), проєктує REST API та інтеграції, рефакторить legacy-код і оптимізує запити. Вимоги: 5+ років досвіду з сучасним PHP 8.x, 3+ роки з Laravel, 3+ роки з React або Vue, сильний TypeScript, досвід з Redis і чергами, автотести та CI/CD.

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

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
30 днів тому

Senior PHP Developer (Game Backend)

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

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

Laravel Query Builder

spatie/laravel-query-builder

Легко будуйте Eloquent-запити на основі запитів від API.

4,470 7.3.7 13 11

Laravel Orion

tailflow/laravel-orion

Orion дозволяє будувати повнофункціональний REST API на основі Eloquent-моделей та їхніх зв'язків з простотою, властивою Laravel.

1,592 2.23.0 5 9