Events


Overview

Lyger’s event system allows decoupled communication between components. Events are dispatched globally and any number of listeners can respond to them. Wildcard patterns allow listening to multiple events with a single registration.


Defining Events

Create an event class extending Lyger\Events\Event:

<?php

namespace App\Events;

use Lyger\Events\Event;

class UserRegistered extends Event
{
    public function __construct(
        public readonly int $userId,
        public readonly string $email
    ) {}

    // Optional: expose payload for logging/broadcasting
    public function getPayload(): array
    {
        return [
            'user_id' => $this->userId,
            'email'   => $this->email,
        ];
    }
}

Registering Listeners

Use EventDispatcher::listen() to register a listener:

use Lyger\Events\EventDispatcher;
use App\Events\UserRegistered;

// Listen to a specific event (by class name short name)
EventDispatcher::listen('UserRegistered', function (UserRegistered $event) {
    // Send welcome email
    mail($event->email, 'Welcome!', 'Thanks for joining.');
});

// Multiple listeners for the same event
EventDispatcher::listen('UserRegistered', function (UserRegistered $event) {
    // Log the registration
    error_log("New user: {$event->email}");
});

Dispatching Events

use Lyger\Events\EventDispatcher;
use App\Events\UserRegistered;

$event = new UserRegistered(userId: $user->id, email: $user->email);
$results = EventDispatcher::dispatch($event);

// $results is an array of all listener return values

Wildcard Listeners

Listen to multiple events using * wildcards:

// Listen to all events
EventDispatcher::listen('*', function ($event) {
    error_log('Event fired: ' . get_class($event));
});

// Listen to all User* events
EventDispatcher::listen('User*', function ($event) {
    // UserRegistered, UserDeleted, UserUpdated, etc.
});

// Listen to events matching a pattern
EventDispatcher::listen('Order*', function ($event) {
    // OrderPlaced, OrderShipped, OrderCancelled
});

Event Payload

You can also dispatch an event with an additional payload array:

EventDispatcher::dispatch($event, ['source' => 'api', 'ip' => '1.2.3.4']);

Checking Listeners

// Does this event have any listeners?
EventDispatcher::hasListeners('UserRegistered');  // bool

// How many listeners?
EventDispatcher::getListenerCount('UserRegistered');  // int

Clearing Listeners

// Clear listeners for a specific event
EventDispatcher::clearEvent('UserRegistered');

// Clear all listeners
EventDispatcher::clear();

Event Service Provider

For organized event registration, create a service provider:

<?php

namespace App\Providers;

use Lyger\Events\EventServiceProvider as BaseProvider;
use Lyger\Events\EventDispatcher;
use App\Events\UserRegistered;
use App\Events\OrderPlaced;

class EventServiceProvider extends BaseProvider
{
    public function register(): void
    {
        EventDispatcher::listen('UserRegistered', function (UserRegistered $e) {
            // Welcome email
        });

        EventDispatcher::listen('OrderPlaced', function (OrderPlaced $e) {
            // Notify fulfillment
        });

        EventDispatcher::listen('User*', function ($e) {
            // Audit log for all user events
        });
    }
}

Boot it in public/index.php:

$provider = new \App\Providers\EventServiceProvider();
$provider->register();

Broadcaster

The Broadcaster allows organizing listeners into named channels:

use Lyger\Events\Broadcaster;
use App\Events\OrderPlaced;

$broadcaster = new Broadcaster();

// Register a channel with a callback
$broadcaster->channel('orders', function (OrderPlaced $event) {
    // Handle order event on this channel
});

// Broadcast an event to a channel
$broadcaster->broadcast('orders', new OrderPlaced($orderId));

Complete Example

// 1. Define events
class UserRegistered extends Event
{
    public function __construct(public int $userId, public string $email) {}
}

class EmailVerified extends Event
{
    public function __construct(public int $userId) {}
}

// 2. Register listeners (in a service provider or bootstrap)
EventDispatcher::listen('UserRegistered', function (UserRegistered $e) {
    // Queue a welcome email
    SendWelcomeEmail::dispatch($e->email);
});

EventDispatcher::listen('EmailVerified', function (EmailVerified $e) {
    $user = User::find($e->userId);
    $user->fill(['verified' => true])->save();
});

// Global audit logger
EventDispatcher::listen('*', function ($event) {
    $name    = $event->getName();
    $payload = json_encode($event->getPayload());
    error_log("[Event] {$name}: {$payload}");
});

// 3. Dispatch in controller
public function register(Request $request): Response
{
    $user = User::create($request->all());
    EventDispatcher::dispatch(new UserRegistered($user->id, $user->email));
    return Response::json($user->toArray(), 201);
}

Method Reference

EventDispatcher

Method Description
listen(string $event, callable $listener): void Register listener (supports wildcards)
dispatch(Event $event, array $payload = []): array Fire event, return listener results
hasListeners(string $event): bool Check if event has listeners
getListenerCount(string $event): int Count listeners for event
clearEvent(string $event): void Remove listeners for an event
clear(): void Remove all listeners

Event (base class)

Method Description
getName(): string Returns the short class name
getPayload(): array Override to expose event data

Copyright © 2026 Lyger Framework. Distributed under the MIT License.

This site uses Just the Docs, a documentation theme for Jekyll.