Event Dispatcher
TinyMVC provides a robust event system that allows components to communicate with each other by dispatching events and listening to them.
Basic Usage
Registering Event Listeners
// Register a single listener
event()->addListener('user.created', function($user) {
// Handle user creation
});
// Register multiple listeners at once
event([
'user.created' => [
function($user) { /* Send welcome email */ },
function($user) { /* Add to mailing list */ }
],
'order.placed' => function($order) {
// Process order
}
]);
Dispatching Events
// Simple event dispatch
event('user.created', $newUser);
// With multiple parameters
event('order.updated', $order, $oldStatus, $newStatus);
Conditional Dispatching
// Dispatch only if condition is true
event()->dispatchIf('user.promoted', $user->isEligibleForPromotion(), $user);
// Dispatch unless condition is true
event()->dispatchUnless('user.suspended', $user->isAdmin(), $user);
Managing Listeners
// Get all registered listeners
$listeners = event()->getListeners();
// Clear all listeners
event()->clearListeners();
Practical Examples
User Registration Flow
// In your service provider or bootstrap file
event([
'user.registered' => [
function($user) {
// Send welcome email
mailer(
to: $user->email,
subject: 'Welcome',
body: 'Welcome to our app!'
)->send();
},
function($user) {
// Create user profile
Profile::create(['user_id' => $user->id]);
}
]
]);
// In your registration controller
public function register(Request $request)
{
$user = User::create($request->all());
event('user.registered', $user);
return redirect('/dashboard');
}
Order Processing
// Define order events
event([
'order.created' => function($order) {
Inventory::reserve($order->items);
},
'order.shipped' => function($order) {
NotifyCustomer::dispatch($order);
Analytics::track('order_shipped', $order);
}
]);
// In your order controller
public function shipOrder(Order $order)
{
$order->update(['status' => 'shipped']);
event('order.shipped', $order);
}
Best Practices:
- Keep event listeners focused on a single responsibility
- Use descriptive event names (e.g., 'user.updated' rather than 'update')
- Consider using dedicated classes for complex event handlers
- Document your events and their expected payloads
Troubleshooting
// Debugging event listeners
$listeners = event()->getListeners();
dd($listeners);
// Verify event is being dispatched
event(['test.event' => fn() => dump('Test event received')]);
event('test.event'); // dispatch it