locky42 / leopard-events
A library for handling PSR-14 events.
1.1.1
2026-03-17 20:01 UTC
Requires
- php: >=8.3
- psr/event-dispatcher: ^1.0
Requires (Dev)
- phpunit/phpunit: ^12.3
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 listenersListenerProvider— in-memory listener storage with priority sortingEventDispatcher— dispatch pipeline implementation
Event Registration
You can register a listener by:
- Event object (stores payload template)
- 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