Download the PHP package zaber-dev/laravel-lock without Composer
On this page you can find all versions of the php package zaber-dev/laravel-lock. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download zaber-dev/laravel-lock
More information about zaber-dev/laravel-lock
Files in zaber-dev/laravel-lock
Package laravel-lock
Short Description Application-level distributed locking for Laravel with Eloquent integration, middleware, automatic owner detection, and cache/database storage.
License MIT
Informations about the package laravel-lock
Laravel Lock
Supports: Laravel 11, 12 & 13+ • PHP 8.2+ • Redis • Memcached • Database
Application-level distributed locking for Laravel. Prevent race conditions and concurrent execution across actions, workflows, and endpoints with automatic owner detection and cleanup.
Manage locks using cache or persistent database storage, attach them to Eloquent models, protect routes with middleware, and automatically track ownership — all through a clean, expressive API.
Unlike Laravel's low-level
Cache::lock(), Laravel Lock elevates distributed locking into a first-class, entity-scoped application abstraction (Lock::for(...)) with owner detection and lifecycle events.
Quick Example
Common Use Cases
Laravel Lock is ideal for:
- Preventing duplicate payment processing
- Serializing inventory allocation and order checkout pipelines
- Protecting high-concurrency webhook processing endpoints
- Ensuring single-instance background cron job execution
- Preventing race conditions during financial account balance transfers
- Coordinating distributed microservice operations
- Preventing simultaneous document edits
Why not Cache::lock()?
Laravel's Cache::lock() is an excellent low-level primitive for atomic locking.
Laravel Lock doesn't replace Cache::lock(). Instead, it builds on the same concept while providing higher-level application primitives for common Laravel workflows. Laravel Lock focuses on application-level locking with:
- Automatic owner resolution (
user_id, queue job ID, or request hash) - Eloquent model integration (
$user->lock('billing_charge')->acquire()) - Route middleware (
lock:billing_charge,30) - Interchangeable storage backends (Cache & persistent Database)
- Rich lifecycle events (
LockAcquired,LockReleased,LockFailed) - Immutable DTOs (
LockInfowith strict date math) - Polymorphic target resolution (Models, strings, integers)
- Automatic database pruning (
model:prune) - High-level fluent API (
Lock::for('action', $target)->ttl(60)->acquire())
Why Laravel Lock?
While Cache::lock() handles basic mutex acquisition, Laravel Lock is engineered for entity-scoped, application-level mutual exclusion across your entire Laravel ecosystem.
| Feature | Cache::lock() | Laravel Lock |
|---|---|---|
| Primary Purpose | Low-level atomic mutex | Application-level distributed locking |
High-Level Fluent API (Lock::for()->ttl()) |
❌ Manual | ✅ Expressive & Clean (Lock::for()) |
| Automatic Owner Resolution | ❌ Manual Token | ✅ Built-in (user_id, job, hash) |
First-Class Eloquent Integration ($user->lock()) |
❌ | ✅ Native (HasLocks) |
| Persistent Database Storage | ❌ Cache Only | ✅ Both Cache & Database Supported |
| Success-Only / Auto-Release Route Middleware | ❌ | ✅ Built-in (RequireLock) |
| Polymorphic Target Scoping | ❌ Manual Keys | ✅ Automatic Key Mapping |
Immutable DTOs (LockInfo) |
❌ | ✅ Strict (CarbonImmutable) |
Automatic Database Pruning (model:prune) |
N/A | ✅ Built-in (Prunable) |
Custom Storage Extensibility (Lock::extend()) |
❌ | ✅ Closure / Container |
Event Dispatching (LockAcquired / Released) |
❌ | ✅ Configurable Events |
Features
- Automatic Owner Detection: Generates and tracks unique ownership tokens automatically (
user_id, job ID, or request hash) to ensure threads only release locks they actually own. - Expressive Fluent API: Chain expressive calls like
Lock::for('process_payout', $user)->ttl(120)->acquire(). - Native Eloquent Integration: Attach the
HasLockstrait to any model for scoped lock management ($user->lock('billing_charge')->acquire()). - Route Middleware: Protect endpoints automatically using
lock:action_name,duration_in_secondswith automatic HTTP429enforcement andfinallyauto-release cleanup. - Multiple Storage Backends (Cache & Database): Choose lightweight fast cache stores (Redis, Memcached, Array) or persistent database-backed locks with automatic cleanup.
- Immutable DTOs: Work safely with strict
LockInfoData Transfer Objects returning precise metadata (key,owner,expiresAt,isExpired()). - Custom Storage Extensibility: Register custom storage drivers on the fly with closure-based creators via
Lock::extend(). - Prunable Database Storage: Built-in
Prunabletrait integration ensures expired database lock records never clutter your database.
Documentation
- Installation
- Configuration
- Usage Guide
- LEARN.md
Installation
Ready to get started? Install the package with Composer:
Publish the configuration and database migrations:
Run migrations if you intend to use the database driver:
Configuration
The configuration file config/locks.php allows you to define your default storage engine, driver parameters, and event dispatching behaviors:
Usage Guide
1. The Fluent Lock API
The Lock facade provides an expressive builder interface for acquiring, checking, blocking, and releasing locks.
Acquiring & Checking a Lock
Atomic Block Execution (block)
For operations vulnerable to concurrent execution bursts, use the block() helper. block() automatically acquires the lock, executes your callback, and safely releases the lock inside a try...finally block:
Force Releasing Locks
If an administrative or recovery script needs to clear a locked resource regardless of owner:
2. Eloquent Model Integration (HasLocks)
Add the HasLocks trait to any Eloquent model to scope locks directly to that entity:
You can now interact directly with your model instance:
Polymorphic Database Querying
When using the database driver, HasLocks also exposes a locks() polymorphic relationship, allowing direct querying and bulk management:
3. Route Middleware
Protect routes declaratively without writing boilerplate checks in your controllers using the RequireLock middleware:
How the Middleware Works:
- Before executing your controller,
RequireLockattempts to acquire a lock for the specified duration (HTTP 429if already locked). - When your controller finishes executing (whether
2xx success,4xx validation error, or5xx exception), the middleware automatically releases the lock in itsfinallyblock so subsequent requests can proceed without waiting for TTL expiration.
4. Working with Storage Backends (using & driver)
By default, the package uses the storage engine defined in config/locks.php. You can switch storage drivers on the fly per request or action:
Registering Custom Storage Drivers
You can extend the LockManager with your own storage drivers (e.g., DynamoDB, Redis Cluster) in your AppServiceProvider:
5. Database Pruning (Prunable)
When using the database driver, expired records are automatically marked for pruning via Laravel's Prunable trait on the ZaberDev\Lock\Models\LockModel model.
To clean up old records automatically, schedule Laravel's model:prune command in your console.php or Kernel.php:
6. Events
Whenever a lock is acquired, released, failed, or force-released, the package dispatches strongly typed events if enabled (locks.events.dispatch = true):
ZaberDev\Lock\Events\LockAcquired: Dispatched whenacquire()succeeds ($key,$owner,$expiresAt,$info).ZaberDev\Lock\Events\LockReleased: Dispatched whenrelease()succeeds ($key,$owner).ZaberDev\Lock\Events\LockFailed: Dispatched whenacquire()fails due to concurrent ownership ($key,$owner).ZaberDev\Lock\Events\LockForceReleased: Dispatched whenforceRelease()clears a lock ($key).
You can listen to these in your EventServiceProvider for logging, monitoring, or alerting.
Related Packages
This package is part of the ZaberDev Laravel Ecosystem (Laravel Productivity Toolkit) — a cohesive suite of high-level application primitives engineered for concurrency, state management, and resource allocation.
Explore the complete directory of packages, detailed use cases, and documentation in our Ecosystem Index Hub.
Testing & Quality
Run the comprehensive PHPUnit test suite locally:
Contributing
Thank you for considering contributing! Please ensure any pull requests include thorough PHPUnit tests covering unit, feature, and driver integration scenarios.
License
The MIT License (MIT). Please see LICENSE.md for more information.
Built with ❤️ as part of the ZaberDev Laravel Ecosystem.
All versions of laravel-lock with dependencies
illuminate/contracts Version ^11.0|^12.0|^13.0
illuminate/database Version ^11.0|^12.0|^13.0
illuminate/support Version ^11.0|^12.0|^13.0
nesbot/carbon Version ^2.63|^3.0