GitHub

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