locky42/leopard-events

A library for handling PSR-14 events.

Maintainers

Package info

github.com/locky42/leopard-events

pkg:composer/locky42/leopard-events

Statistics

Installs: 14

Dependents: 4

Suggesters: 0

Stars: 0

Open Issues: 0

1.1.1 2026-03-17 20:01 UTC

This package is auto-updated.

Last update: 2026-03-17 20:02:58 UTC


README

locky42/leopard-events is a lightweight PSR-14 style event library for PHP 8.3+.

Installation

composer require locky42/leopard-events

Core Classes

  • EventManager — static facade for registering/removing/dispatching listeners
  • ListenerProvider — in-memory listener storage with priority sorting
  • EventDispatcher — dispatch pipeline implementation

Event Registration

You can register a listener by:

  1. Event object (stores payload template)
  2. Event class string (no object instantiation at registration time)
use Leopard\Events\EventManager;

class MyEvent {
    public function __construct(public ?object $obj = null) {}
    public bool $handled = false;
}

// Object registration
EventManager::addEvent(new MyEvent(), function (MyEvent $event) {
    $event->handled = true;
});

// Class-string registration (safe even if constructor has required args)
EventManager::addEvent(MyEvent::class, function (MyEvent $event) {
    $event->handled = true;
});

Dispatching

Dispatch by class name:

$event = EventManager::doEvent(MyEvent::class);

Or pass constructor arguments:

$payload = new \stdClass();
$payload->value = 10;

$event = EventManager::doEvent(MyEvent::class, $payload);

Shared Event State Between Listeners

When dispatching, listeners for the same event class receive the same event instance in the dispatch cycle. Mutations made by one listener are visible to subsequent listeners.

EventManager::addEvent(MyEvent::class, function (MyEvent $event) {
    $event->handled = true;
});

EventManager::addEvent(MyEvent::class, function (MyEvent $event) {
    // sees handled === true
});

Listener Priority

addEvent(..., $priority) supports integer priorities.

EventManager::addEvent(MyEvent::class, $firstListener, -100);
EventManager::addEvent(MyEvent::class, $secondListener, 0);
EventManager::addEvent(MyEvent::class, $thirdListener, 100);

Listeners are sorted by priority before dispatch.

Removing and Clearing Listeners

EventManager::removeEvent(new MyEvent(), $listener);
EventManager::getProvider()->clearListeners();

removeEvent requires an event object (not class string).

Testing

./vendor/bin/phpunit --bootstrap vendor/autoload.php tests

License

MIT