1. Go to this page and download the library: Download slash-dw/idempotency-kit 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/ */
slash-dw / idempotency-kit example snippets
// routes/api.php
use SlashDw\IdempotencyKit\Http\Middleware\IdempotentMiddleware;
Route::post('/subscriptions', SubscriptionController::class)
->middleware('idempotent');
// With custom TTL (7 days for financial operations):
Route::post('/payments', PaymentController::class)
->middleware('idempotent:604800');
use SlashDw\IdempotencyKit\Http\Middleware\IdempotentMiddleware;
Route::post('/orders', OrderController::class)
->middleware(IdempotentMiddleware::using(ttl: 3600, scope: 'ip'));
// Reject /register requests that omit the Idempotency-Key header (HTTP 400)
Route::post('/register', RegisteredUserController::class)
->middleware(IdempotentMiddleware::using(
// Login is naturally idempotent — skip the middleware for this route
Route::post('/login', AuthenticatedSessionController::class)
->middleware(IdempotentMiddleware::using(enabled: false));
use SlashDw\IdempotencyKit\Http\Attributes\Idempotent;
#[Idempotent(ttl: 86400)]
class PaymentController extends Controller
{
public function store(Request $request): JsonResponse { /* ... */ }
}
// config/idempotency_kit.php
'scope' => 'user', // authenticated user ID (fallback: IP)
'scope' => 'ip', // requester's IP address
'scope' => 'global', // no isolation (use only when truly user-agnostic)
// Custom resolver (multi-tenant: scope by company):
'resolver' => App\Idempotency\CompanyScopeResolver::class,
use SlashDw\IdempotencyKit\Contracts\ScopeResolverContract;
use Illuminate\Http\Request;
final class CompanyScopeResolver implements ScopeResolverContract
{
public function resolve(Request $request): string
{
return (string) (auth()->user()?->company_id ?? $request->ip());
}
}
// app/Providers/EventServiceProvider.php
use SlashDw\IdempotencyKit\Events\IdempotencyKeyAbused;
use App\Listeners\NotifyIdempotencyAbuse;
protected $listen = [
IdempotencyKeyAbused::class => [NotifyIdempotencyAbuse::class],
];
// app/Listeners/NotifyIdempotencyAbuse.php
use SlashDw\IdempotencyKit\Events\IdempotencyKeyAbused;
final class NotifyIdempotencyAbuse
{
public function handle(IdempotencyKeyAbused $event): void
{
logger()->warning('Idempotency key replayed excessively', [
'key' => $event->idempotencyKey,
'scope' => $event->scope,
'hits' => $event->hitCount,
'route' => $event->route,
]);
}
}