Overview
Middleware wraps around workflow and activity execution, providing hooks for logging, locking, event dispatching, and custom behavior.Built-in Middleware
The package includes two essential middleware classes:WithoutOverlappingMiddleware
Prevents concurrent execution of workflows and activities using cache-based locking. Location:src/Middleware/WithoutOverlappingMiddleware.php
Purpose:
- Ensures only one workflow instance executes at a time
- Prevents activity race conditions
- Uses cache as a distributed lock
src/Exception.php:66-76, workflows automatically use this middleware:
src/Activity.php:135-146, activities also use it:
src/Middleware/WithoutOverlappingMiddleware.php:74-137:
-
Workflow Lock:
- Acquires lock only if no workflow OR activities are running
- Blocks all activities while workflow executes
- Uses workflow semaphore counter
-
Activity Lock:
- Acquires lock if no workflow is running
- Multiple activities can run concurrently
- Uses activity semaphore list with unique keys
ActivityMiddleware
Handles activity lifecycle events and result propagation. Location:src/Middleware/ActivityMiddleware.php
Purpose:
- Dispatches activity lifecycle events
- Captures activity results
- Propagates results to workflow
- Handles activity failures
src/Middleware/ActivityMiddleware.php:23-66:
- ActivityStarted - Dispatched when activity begins
- Activity Execution - Runs the activity
- ActivityCompleted - Dispatched on success
- ActivityFailed - Dispatched on error
src/Middleware/ActivityMiddleware.php:68-91, after the lock is released:
Custom Middleware
Create middleware for workflows or activities:Logging Middleware
Performance Monitoring Middleware
Rate Limiting Middleware
Timeout Middleware
Error Recovery Middleware
Applying Middleware
To Activities
Override themiddleware() method:
To Workflows
Custom middleware for workflow execution:Conditional Middleware
Apply middleware based on conditions:Middleware Execution Order
Middleware executes in the order defined:Middleware Communication
Pass data between middleware layers:Testing Middleware
Best Practices
Keep Middleware Focused
Keep Middleware Focused
Each middleware should have a single responsibility:
Always Call Next
Always Call Next
Ensure middleware chain continues:
Handle Exceptions Carefully
Handle Exceptions Carefully
Make Middleware Configurable
Make Middleware Configurable
Related Topics
- Activities - Activity basics
- Error Handling - Exception handling
- Retries - Retry strategies
- Events - Workflow events