Laravel Idempotency: middleware для идемпотентных HTTP-запросов

Вендэлл Адриэль представил пакет Laravel Idempotency, который добавляет поддержку идемпотентности для write-запросов в Laravel. При повторной отправке POST, PUT или PATCH с тем же ключом и тем же payload пакет возвращает закэшированный ответ вместо повторного выполнения обработчика. Это используется в сценариях с платежами, созданием заказов и других API, где возможны повторы из-за сетевых сбоев.

Подключение middleware

Пакет можно применить к маршруту через стандартный middleware:

use WendellAdriel\Idempotency\Http\Middleware\Idempotent;

Route::post('/orders', StoreOrderController::class)
    ->middleware(Idempotent::class);

Middleware ожидает заголовок Idempotency-Key. Если тот же ключ приходит повторно с идентичными данными, возвращается исходный ответ с дополнительным заголовком Idempotency-Replayed: true.

Настройки можно задать на уровне маршрута:

Route::post('/payments', ChargePaymentController::class)->middleware(
    Idempotent::using(
        ttl: 600,
        lockTimeout: 30,
        required: false,
        scope: \WendellAdriel\Idempotency\Enums\IdempotencyScope::Ip,
        header: 'X-Idempotency-Key',
    )
);

Также доступен вариант через PHP-атрибуты для класса или метода контроллера:

use WendellAdriel\Idempotency\Attributes\Idempotent;
use WendellAdriel\Idempotency\Enums\IdempotencyScope;

#[Idempotent]
class PaymentController
{
    #[Idempotent(ttl: 600, lockTimeout: 30, scope: IdempotencyScope::Ip)]
    public function store()
    {
        // ...
    }
}

Атрибут наследует поведение стандартных middleware Laravel, поэтому поддерживаются параметры only и except.

Область действия ключей

Ключи идемпотентности могут работать в разных областях, которые настраиваются глобально или для конкретного маршрута:

  • user - ключи разделяются по пользователям, для гостей используется IP

  • ip - разделение по IP-адресу

  • global - один ключ действует для всех пользователей и IP

Обработка конфликтов

Пакет обрабатывает два типа конфликтов. Если приходит тот же ключ, но с другим payload, возвращается ошибка 422 Unprocessable Entity.

Если второй идентичный запрос поступает до завершения первого, возвращается 409 Conflict с заголовком Retry-After: 1.

Обе ситуации реализованы через атомарные блокировки кеша, поэтому требуется драйвер с поддержкой lock, например Redis или Memcached.

Artisan-команды

Пакет добавляет команды для работы с кешированными записями. Просмотр активных записей:

php artisan idempotency:list --scope=user --id=5

Удаление записей:

# удалить все записи пользователя
php artisan idempotency:forget --scope=user --id=5 --force

# удалить записи по ключу
php artisan idempotency:forget --key=checkout-1 --force

Команда удаления требует подтверждения, если не указан флаг --force.

Похожие статьи

Рекомендательные технологии Подробнее
Разработка и инструменты • 9 месяцев назад

Laravel 12.44: добавлены HTTP-клиентские callbacks после получения ответа

Обзор релиза Laravel 12.44: добавлен метод afterResponse() для HTTP-клиента, новые методы для тестов и улучшенная валидация дат. Поясняется, как использовать новые фичи на практике.

Технологии и IT-новости • 9 месяцев назад

Плагин Wayback Machine для WordPress: спасение от сломанных ссылок

Рассказываем о новом бесплатном плагине Internet Archive Wayback Machine Link Fixer для WordPress, который защищает сайт от «гниения ссылок», автоматически перенаправляя посетителей к архивным версиям страниц. Плагин сканирует внешние ссылки, отправляет их на сохранение и поддерживает актуальность контента.

Технологии и IT-новости • 10 месяцев назад

Микророботы, которые могут изменить медицину

Маленькие автономные роботы, способные двигаться, "думать" и действовать без внешнего управления. Они могут иметь важные применения в медицине и других областях, но пока работают при световом питании и в токсичных растворах.

Технологии и IT-новости • 10 месяцев назад

LG возвращает "Wallpaper" OLED: экран толщиной всего 9 мм

LG вернула на CES 2026 ультратонкий телевизор из серии "Wallpaper" - OLED evo W6 с толщиной корпуса всего 9 мм. Новинка сочетает минималистичный дизайн с продвинутыми технологиями изображения и игровой функциональностью.