<?php
namespace App\Events;
use App\Models\Order;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class OrderPlaced
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public function __construct(
public Order $order
) {}
}
<?php
namespace App\Listeners;
use App\Events\OrderPlaced;
use App\Mail\OrderConfirmationMail;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Support\Facades\Mail;
class SendOrderConfirmation implements ShouldQueue
{
public $queue = 'emails';
public function handle(OrderPlaced $event): void
{
Mail::to($event->order->customer->email)
->send(new OrderConfirmationMail($event->order));
}
public function shouldQueue(OrderPlaced $event): bool
{
return $event->order->total > 100;
}
}
<?php
namespace App\Providers;
use App\Events\OrderPlaced;
use App\Listeners\SendOrderConfirmation;
use App\Listeners\UpdateInventory;
use App\Listeners\NotifyAdmins;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
OrderPlaced::class => [
SendOrderConfirmation::class,
UpdateInventory::class,
NotifyAdmins::class,
],
];
public function boot(): void
{
//
}
public function shouldDiscoverEvents(): bool
{
return true; // Auto-discover events
}
}
<?php
// Fire event
OrderPlaced::dispatch($order);
// In controller
public function store(StoreOrderRequest $request)
{
$order = Order::create($request->validated());
event(new OrderPlaced($order));
return redirect()->route('orders.show', $order);
}
Events and listeners decouple application logic, making code modular and testable. When significant actions occur—user registered, order placed—I fire events. Multiple listeners can respond to one event without the event knowing about them. Events are simple data containers extending Illuminate\Foundation\Events\Dispatchable. Listeners implement handle() methods receiving the event. Queueable listeners process asynchronously via ShouldQueue. The EventServiceProvider maps events to listeners. This pattern enables side effects like sending emails, logging, or updating statistics without cluttering core business logic. Observers simplify Eloquent model events. Event discovery automatically registers listeners without manual mapping.