PHPackages                             andrewdyer/event-dispatcher - 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. andrewdyer/event-dispatcher

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

andrewdyer/event-dispatcher
===========================

A framework-agnostic library for implementing the observer pattern through named events and registered listeners

1.0.1(2w ago)11MITPHPPHP ^8.3CI passing

Since Apr 24Pushed 2w ago1 watchersCompare

[ Source](https://github.com/andrewdyer/event-dispatcher)[ Packagist](https://packagist.org/packages/andrewdyer/event-dispatcher)[ Docs](https://github.com/andrewdyer/event-dispatcher)[ RSS](/packages/andrewdyer-event-dispatcher/feed)WikiDiscussions main Synced today

READMEChangelog (2)Dependencies (4)Versions (3)Used By (0)

Event Dispatcher
================

[](#event-dispatcher)

A framework-agnostic library for implementing the observer pattern through named events and registered listeners.

[![Latest Stable Version](https://camo.githubusercontent.com/ae4eb674154360936e5b11c6dd69ca80c55833843c35d7e29b50578d183e8786/687474703a2f2f706f7365722e707567782e6f72672f616e64726577647965722f6576656e742d646973706174636865722f763f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andrewdyer/event-dispatcher)[![Total Downloads](https://camo.githubusercontent.com/2e819a880cd60520cb73bad456f7900fb3e820da18bbb1bcdc560250ec93f6e6/687474703a2f2f706f7365722e707567782e6f72672f616e64726577647965722f6576656e742d646973706174636865722f646f776e6c6f6164733f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andrewdyer/event-dispatcher)[![License](https://camo.githubusercontent.com/cd3dea744d38d6bbc01dcefa84473da346f83213bdef953e00c1113a1c61a05f/687474703a2f2f706f7365722e707567782e6f72672f616e64726577647965722f6576656e742d646973706174636865722f6c6963656e73653f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andrewdyer/event-dispatcher)[![PHP Version Require](https://camo.githubusercontent.com/94619045212e4374e99d361291a55ff7727792b7427e56540adecd9e195ae305/687474703a2f2f706f7365722e707567782e6f72672f616e64726577647965722f6576656e742d646973706174636865722f726571756972652f7068703f7374796c653d666c61742d737175617265)](https://packagist.org/packages/andrewdyer/event-dispatcher)

Introduction
------------

[](#introduction)

This library lets events be defined as classes and listeners attached to them by name, with the dispatcher notifying every registered listener in the order they were added when an event is triggered. Listeners are kept fully decoupled from the code that raises the event, making it straightforward to extend application behaviour without modifying the originating logic, regardless of the framework in use.

Prerequisites
-------------

[](#prerequisites)

- **[PHP](https://www.php.net/)**: Version 8.3 or higher is required.
- **[Composer](https://getcomposer.org/)**: Dependency management tool for PHP.

Installation
------------

[](#installation)

```
composer require andrewdyer/event-dispatcher
```

Getting Started
---------------

[](#getting-started)

### 1. Define an event

[](#1-define-an-event)

Create a class that implements `EventInterface`, or extend `AbstractEvent`. By default, the event name is the short (unqualified) class name, but this can be overridden:

```
namespace App\Events;

use AndrewDyer\EventDispatcher\Events\AbstractEvent;

class UserRegistered extends AbstractEvent
{
    public function getName(): string
    {
        return 'UserRegistered';
    }
}
```

### 2. Create a listener

[](#2-create-a-listener)

Create a class that implements `ListenerInterface`, or extend `AbstractListener`:

```
namespace App\Listeners;

use AndrewDyer\EventDispatcher\Events\EventInterface;
use AndrewDyer\EventDispatcher\Listeners\AbstractListener;

class SendRegistrationEmail extends AbstractListener
{
    public function handle(EventInterface $event): void
    {
        // Send welcome email to user...
    }
}
```

### 3. Set up the dispatcher

[](#3-set-up-the-dispatcher)

Instantiate `EventDispatcher`:

```
use AndrewDyer\EventDispatcher\EventDispatcher;

$dispatcher = new EventDispatcher();
```

Usage
-----

[](#usage)

### Registering a listener

[](#registering-a-listener)

Attach a listener to a specific event name via `addListener()`:

```
use App\Listeners\SendRegistrationEmail;

$dispatcher->addListener('UserRegistered', new SendRegistrationEmail());
```

Multiple listeners can be registered against the same event name; they are executed in the order they were added.

### Dispatching an event

[](#dispatching-an-event)

Trigger an event and notify all of its registered listeners via `dispatch()`:

```
use App\Events\UserRegistered;

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

License
-------

[](#license)

Licensed under the [MIT licence](https://opensource.org/licenses/MIT) and is free for private or commercial projects.

###  Health Score

42

—

FairBetter than 88% of packages

Maintenance96

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity54

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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

Every ~418 days

Total

2

Last Release

18d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/666597ea6e46748a89fe8764d1a45b4d0da97daf1bb1e9770ea34ae41f706d08?d=identicon)[andrewdyer](/maintainers/andrewdyer)

---

Top Contributors

[![andrewdyer](https://avatars.githubusercontent.com/u/8114523?v=4)](https://github.com/andrewdyer "andrewdyer (27 commits)")

---

Tags

event-dispatchereventsframework-agnosticlistenersobserver-patternphpphpeventsevent dispatcherframework agnosticobserver patternlisteners

###  Code Quality

TestsPHPUnit

Code StylePHP CS Fixer

### Embed Badge

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

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

###  Alternatives

[doctrine/event-manager

The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.

6.0k526.1M158](/packages/doctrine-event-manager)[php-flasher/flasher

The foundational PHP library for PHPFlasher, enabling the creation of framework-agnostic flash notifications. Ideal for building custom integrations or for use in PHP projects.

654.7M41](/packages/php-flasher-flasher)[slince/event-dispatcher

Event dispatcher package

106.1k2](/packages/slince-event-dispatcher)

PHPackages © 2026

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