Laravel Background Processing
Priority: P1 (HIGH)
Structure
app/
├── Jobs/ # Asynchronous tasks
├── Events/ # Communication flags
└── Listeners/ # Task reactions
Implementation Guidelines
Queued Jobs
- Job Creation: Use
php artisan make:job ProcessOrder. Classes must implementShouldQueue. - Execution: Implement logic inside the
handle()method. Pass only model IDs to the constructor, not the full Eloquent model. - Dispatching: Trigger via
ProcessOrder::dispatch($orderId).
Advanced Workflow Patterns
- Job Chaining: Use
Bus::chain([new ProcessPayment($order), new SendReceipt($order)])->dispatch()for sequential dependencies. Handle failures with->catch(fn => ...). - Job Batching: Use
Bus::batch([new ImportRow(1), ...])->then(...)->catch(...)->dispatch(). Use$this->batch()->cancel()to abort and track via$batch->progress().
Events & Listeners
- Scaffolding: Run
php artisan make:event OrderPlacedandphp artisan make:listener SendConfirmation --event=OrderPlaced. - Async Execution: Add
ShouldQueueto listeners to process them asynchronously. - Activation: Trigger with
Event::dispatch(new OrderPlaced($order)).
Reliability & Monitoring
- Error Handling: Implement
public function failed(Throwable $exception)in your job class. Usepublic int $tries = 3andpublic int $backoff = 60for retries. - Setup: Run the
queue:failed-tablemigration to track dead jobs. - Monitoring: Use Laravel Horizon (run
php artisan horizon) for real-time observability; never usequeue:workin production.
Anti-Patterns
- No heavy logic in request path: Defer tasks >100ms to Queues.
- No full model in job payload: Pass IDs; Eloquent fetches on run.
- No deep event listener chains: Keep listener depth shallow.
- No unmonitored queues: Configure retries and Horizon alerts.