PHPackages                             inanepain/event - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. inanepain/event

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

inanepain/event
===============

PSR-14 implementation: event dispatcher.

0.1.0(3y ago)10UNLICENSEPHP

Since Jul 26Pushed 2w ago1 watchersCompare

[ Source](https://github.com/inanepain/event)[ Packagist](https://packagist.org/packages/inanepain/event)[ Docs](http://vaieen.local:8000/inane/event)[ RSS](/packages/inanepain-event/feed)WikiDiscussions develop Synced 1w ago

READMEChangelogDependencies (1)Versions (3)Used By (0)

inanepain/event [![icon](./icon.png "inanepain/event")](./icon.png)
===================================================================

[](#inanepainevent-)

Table of Contents

- [![icon](./icon.png "inanepain/event") inanepain/event](#inanepainevent)
- [1. Install](#install)
- [2. Usage](#usage)
    - [2.1. Events](#events)
        - [2.1.1. Event](#event)
        - [2.1.2. StoppableEvent](#stoppableevent)
    - [2.2. Dispatcher](#dispatcher)
        - [2.2.1. EventDispatcher](#eventdispatcher)
        - [2.2.2. Listener Providers](#listener-providers)
    - [2.3. Listener Providers](#listener-providers-1)
        - [2.3.1. Default Provider](#default-provider-1)
        - [2.3.2. Prioritised Provider](#prioritised-provider-1)
        - [2.3.3. Randomized Provider](#randomized-provider-1)
        - [2.3.4. Aggregate Provider](#aggregate-provider-1)

[![icon](./icon.png "inanepain/event")](./icon.png) inanepain/event
-------------------------------------------------------------------

[](#-inanepainevent)

PSR-14 implementation: event dispatcher.

1. Install
----------

[](#1-install)

composer

```
composer require inanepain/event
```

2. Usage
--------

[](#2-usage)

### 2.1. Events

[](#21-events)

#### 2.1.1. Event

[](#211-event)

`Inane\Event\Event`

Base event class. Extend this to create custom events.

##### Properties

[](#properties)

`name` : `string`The event name. Defaults to the fully-qualified class name of the event if not explicitly set.

##### Usage

[](#usage)

```
use Inane\Event\Event;

// Use directly
$event = new Event();
echo $event->name; // "Inane\Event\Event"

// Extend to create a named domain event
class UserRegistered extends Event {
    public function __construct(
        public readonly string $username
    ) {}
}

$event = new UserRegistered('alice');
echo $event->name;     // "UserRegistered"
echo $event->username; // "alice"
```

#### 2.1.2. StoppableEvent

[](#212-stoppableevent)

`Inane\Event\StoppableEvent`

Extends `Event` and implements `StoppableEventInterface`. Allows event propagation to be halted mid-dispatch; once stopped, propagation cannot be resumed.

##### Properties

[](#properties-1)

`propagationStopped` : `bool`Whether propagation has been stopped. Once set to `true` it cannot be reset to `false`.

##### Methods

[](#methods)

`isPropagationStopped()` : `bool`Returns `true` if propagation has been stopped.

`stopPropagation()` : `void`Stops propagation of the event to further listeners.

##### Usage

[](#usage-1)

```
use Inane\Event\StoppableEvent;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\ListenerProvider;

class Odd extends StoppableEvent {
    public function __construct(
        public readonly string $message = ''
    ) {}
}

$provider = new ListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Odd::class, function (Odd $event) {
    echo "Listener 1: " . $event->message . "\n";
    if ($event->message > 5) $event->stopPropagation();
});

$provider->addListener(Odd::class, function (Odd $event) {
    echo "Listener 2: " . $event->message . "\n";
});

$dispatcher->dispatch(new Odd('3')); // both listeners fire
$dispatcher->dispatch(new Odd('7')); // only listener 1 fires
```

### 2.2. Dispatcher

[](#22-dispatcher)

#### 2.2.1. EventDispatcher

[](#221-eventdispatcher)

`Inane\Event\EventDispatcher`

Implements `EventDispatcherInterface`. Dispatches events to all registered listeners via a `ListenerProviderInterface`. Respects `StoppableEventInterface` — propagation halts as soon as `isPropagationStopped()` returns `true`.

##### Constructor

[](#constructor)

`__construct(ListenerProviderInterface $provider)`Accepts any listener provider implementing `ListenerProviderInterface`.

##### Methods

[](#methods-1)

`dispatch(object $event)` : `object`Dispatches the event to all applicable listeners and returns the (possibly modified) event.

##### Usage

[](#usage-2)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\ListenerProvider;

$provider = new ListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, function (Event $event) {
    echo "Received: " . $event->name . "\n";
});

$dispatcher->dispatch(new Event());
```

#### 2.2.2. Listener Providers

[](#222-listener-providers)

##### Default Provider

[](#default-provider)

`Inane\Event\Provider\ListenerProvider`

Basic listener provider. Listeners are registered per event class name and returned in the order they were added.

###### Methods

[](#methods-2)

`addListener(string|object $event, callable $listener)` : `static`Registers a listener for the given event class name or instance. Returns the provider for chaining.

`getListenersForEvent(object $event)` : `iterable`Returns all listeners registered for the event’s class, in insertion order.

###### Usage

[](#usage-3)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\ListenerProvider;

$provider = new ListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("First\n"))
         ->addListener(Event::class, fn (Event $e) => print("Second\n"));

$dispatcher->dispatch(new Event());
// First
// Second
```

##### Prioritised Provider

[](#prioritised-provider)

`Inane\Event\Provider\PrioritisedListenerProvider`

Listener provider that dispatches listeners in priority order. Higher priority values are called first; listeners with equal priority are called in insertion order.

###### Methods

[](#methods-3)

`addListener(string|object $event, callable $listener, int $priority = 0)` : `static`Registers a listener with an optional priority (default `0`). Returns the provider for chaining.

`getListenersForEvent(object $event)` : `iterable`Returns listeners ordered by descending priority.

`clearListeners(string|object $event)` : `void`Removes all listeners registered for the given event.

###### Usage

[](#usage-4)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\PrioritisedListenerProvider;

$provider = new PrioritisedListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("Low\n"),    priority: -10)
         ->addListener(Event::class, fn (Event $e) => print("Default\n"))
         ->addListener(Event::class, fn (Event $e) => print("High\n"),   priority: 10);

$dispatcher->dispatch(new Event());
// High
// Default
// Low
```

##### Randomized Provider

[](#randomized-provider)

`Inane\Event\Provider\RandomizedListenerProvider`

Extends `ListenerProvider`. Returns listeners in a randomised order on each dispatch. Useful for testing that application behaviour does not depend on listener execution order.

###### Methods

[](#methods-4)

Inherits `addListener()` from `ListenerProvider`.

`getListenersForEvent(object $event)` : `iterable`Returns all listeners for the event in a randomised order.

###### Usage

[](#usage-5)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\RandomizedListenerProvider;

$provider = new RandomizedListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("A\n"))
         ->addListener(Event::class, fn (Event $e) => print("B\n"))
         ->addListener(Event::class, fn (Event $e) => print("C\n"));

// Order of A, B, C is random on each dispatch
$dispatcher->dispatch(new Event());
```

##### Aggregate Provider

[](#aggregate-provider)

`Inane\Event\Provider\AggregateProvider`

Combines multiple listener providers into one. Each sub-provider is queried in the order it was added; all listeners from the first provider are returned before any from the second, and so on. Per-provider internal ordering is preserved, but cross-provider ordering is not guaranteed.

###### Methods

[](#methods-5)

`addProvider(ListenerProviderInterface $provider)` : `static`Appends a provider to the aggregate. Returns the aggregate for chaining.

`getListenersForEvent(object $event)` : `iterable`Yields listeners from each sub-provider in registration order.

###### Usage

[](#usage-6)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\AggregateProvider;
use Inane\Event\Provider\ListenerProvider;
use Inane\Event\Provider\PrioritisedListenerProvider;

$basic      = new ListenerProvider();
$prioritized = new PrioritisedListenerProvider();

$basic->addListener(Event::class, fn (Event $e) => print("Basic listener\n"));
$prioritized->addListener(Event::class, fn (Event $e) => print("Priority listener\n"), priority: 5);

$aggregate = new AggregateProvider();
$aggregate->addProvider($basic)
          ->addProvider($prioritized);

$dispatcher = new EventDispatcher($aggregate);
$dispatcher->dispatch(new Event());
// Basic listener
// Priority listener
```

### 2.3. Listener Providers

[](#23-listener-providers)

#### 2.3.1. Default Provider

[](#231-default-provider)

`Inane\Event\Provider\ListenerProvider`

Basic listener provider. Listeners are registered per event class name and returned in the order they were added.

##### Methods

[](#methods-6)

`addListener(string|object $event, callable $listener)` : `static`Registers a listener for the given event class name or instance. Returns the provider for chaining.

`getListenersForEvent(object $event)` : `iterable`Returns all listeners registered for the event’s class, in insertion order.

##### Usage

[](#usage-7)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\ListenerProvider;

$provider = new ListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("First\n"))
         ->addListener(Event::class, fn (Event $e) => print("Second\n"));

$dispatcher->dispatch(new Event());
// First
// Second
```

#### 2.3.2. Prioritised Provider

[](#232-prioritised-provider)

`Inane\Event\Provider\PrioritisedListenerProvider`

Listener provider that dispatches listeners in priority order. Higher priority values are called first; listeners with equal priority are called in insertion order.

##### Methods

[](#methods-7)

`addListener(string|object $event, callable $listener, int $priority = 0)` : `static`Registers a listener with an optional priority (default `0`). Returns the provider for chaining.

`getListenersForEvent(object $event)` : `iterable`Returns listeners ordered by descending priority.

`clearListeners(string|object $event)` : `void`Removes all listeners registered for the given event.

##### Usage

[](#usage-8)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\PrioritisedListenerProvider;

$provider = new PrioritisedListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("Low\n"),    priority: -10)
         ->addListener(Event::class, fn (Event $e) => print("Default\n"))
         ->addListener(Event::class, fn (Event $e) => print("High\n"),   priority: 10);

$dispatcher->dispatch(new Event());
// High
// Default
// Low
```

#### 2.3.3. Randomized Provider

[](#233-randomized-provider)

`Inane\Event\Provider\RandomizedListenerProvider`

Extends `ListenerProvider`. Returns listeners in a randomised order on each dispatch. Useful for testing that application behaviour does not depend on listener execution order.

##### Methods

[](#methods-8)

Inherits `addListener()` from `ListenerProvider`.

`getListenersForEvent(object $event)` : `iterable`Returns all listeners for the event in a randomised order.

##### Usage

[](#usage-9)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\RandomizedListenerProvider;

$provider = new RandomizedListenerProvider();
$dispatcher = new EventDispatcher($provider);

$provider->addListener(Event::class, fn (Event $e) => print("A\n"))
         ->addListener(Event::class, fn (Event $e) => print("B\n"))
         ->addListener(Event::class, fn (Event $e) => print("C\n"));

// Order of A, B, C is random on each dispatch
$dispatcher->dispatch(new Event());
```

#### 2.3.4. Aggregate Provider

[](#234-aggregate-provider)

`Inane\Event\Provider\AggregateProvider`

Combines multiple listener providers into one. Each sub-provider is queried in the order it was added; all listeners from the first provider are returned before any from the second, and so on. Per-provider internal ordering is preserved, but cross-provider ordering is not guaranteed.

##### Methods

[](#methods-9)

`addProvider(ListenerProviderInterface $provider)` : `static`Appends a provider to the aggregate. Returns the aggregate for chaining.

`getListenersForEvent(object $event)` : `iterable`Yields listeners from each sub-provider in registration order.

##### Usage

[](#usage-10)

```
use Inane\Event\Event;
use Inane\Event\EventDispatcher;
use Inane\Event\Provider\AggregateProvider;
use Inane\Event\Provider\ListenerProvider;
use Inane\Event\Provider\PrioritisedListenerProvider;

$basic      = new ListenerProvider();
$prioritized = new PrioritisedListenerProvider();

$basic->addListener(Event::class, fn (Event $e) => print("Basic listener\n"));
$prioritized->addListener(Event::class, fn (Event $e) => print("Priority listener\n"), priority: 5);

$aggregate = new AggregateProvider();
$aggregate->addProvider($basic)
          ->addProvider($prioritized);

$dispatcher = new EventDispatcher($aggregate);
$dispatcher->dispatch(new Event());
// Basic listener
// Priority listener
```

###  Health Score

29

—

LowBetter than 57% of packages

Maintenance63

Regular maintenance activity

Popularity2

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity39

Early-stage or recently created project

 Bus Factor1

Top contributor holds 82.1% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

1459d ago

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/1823594?v=4)[Philip Michael Raab](/maintainers/inanepain)[@inanepain](https://github.com/inanepain)

---

Top Contributors

[![inanepain](https://avatars.githubusercontent.com/u/1823594?v=4)](https://github.com/inanepain "inanepain (23 commits)")[![philipmraab](https://avatars.githubusercontent.com/u/177214788?v=4)](https://github.com/philipmraab "philipmraab (5 commits)")

---

Tags

phpeventlistenerdispatcherinane

### Embed Badge

![Health badge](/badges/inanepain-event/health.svg)

```
[![Health](https://phpackages.com/badges/inanepain-event/health.svg)](https://phpackages.com/packages/inanepain-event)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
