PHPackages                             webino/event-emitter - 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. webino/event-emitter

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

webino/event-emitter
====================

Event Emitter implementation.

1.1.0(6y ago)11381BSD-3-ClausePHPPHP ~7.1

Since Mar 21Pushed 6y ago1 watchersCompare

[ Source](https://github.com/webino/event-emitter)[ Packagist](https://packagist.org/packages/webino/event-emitter)[ RSS](/packages/webino-event-emitter/feed)WikiDiscussions develop Synced 3d ago

READMEChangelogDependencies (5)Versions (5)Used By (1)

Webino Event Emitter
====================

[](#webino-event-emitter)

Event Emitter implementation.

[![Build Status](https://camo.githubusercontent.com/b69798f7b8913a40e2dec958b7fbeaf10ba892481d112a18921297f3c4055c3a/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f776562696e6f2f6576656e742d656d69747465722f6d61737465722e7376673f7374796c653d666f722d7468652d6261646765)](http://travis-ci.org/webino/event-emitter "Master Build Status")[![Coverage Status](https://camo.githubusercontent.com/99370f312bf5b23f068cc452449ead723d0d0f89223a6c24759b0e796c0979ed/68747470733a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f6769746875622f776562696e6f2f6576656e742d656d69747465722f6d61737465722e7376673f7374796c653d666f722d7468652d6261646765)](https://coveralls.io/github/webino/event-emitter?branch=master "Master Coverage Status")[![Code Quality](https://camo.githubusercontent.com/866734be89c6cd5016749fb93680fcfc8036c8ab77f09b2d45ebb6e283bb71f7/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f776562696e6f2f6576656e742d656d69747465722f6d61737465722e7376673f7374796c653d666f722d7468652d6261646765)](https://scrutinizer-ci.com/g/webino/event-emitter/?branch=master "Master Code Quality")[![Latest Stable Version](https://camo.githubusercontent.com/537952d1e19559ac93642b2ab860ec59787cef6c90befb92f266c04bfd6f8cb5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672f776562696e6f2f6576656e742d656d69747465722e7376673f6c6162656c3d535441424c45267374796c653d666f722d7468652d6261646765)](https://packagist.org/packages/webino/event-emitter)

Recommended Usage
-----------------

[](#recommended-usage)

Use event emitter to decouple routine algorithm from an extended logic.

Setup
-----

[](#setup)

[![PHP from Packagist](https://camo.githubusercontent.com/f9f6e4a281fce376cf5b6953d647a28b588b975c672e17763c153e87f7df4b08/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)](https://php.net "Required PHP version")

```
composer require webino\event-emitter
```

Quick Use
---------

[](#quick-use)

Emitting an event:

```
use Webino\EventEmitter;

$emitter = new EventEmitter;

// registering closure event handler
$emitter->on('example', function () {
    return 'Hello';
});

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => Hello
```

Removing an event handler:

```
use Webino\EventEmitter;

$emitter = new EventEmitter;

$handler = function () {
    return 'Hello';
};

$emitter->on('example', $handler);

// remove handler for all events
$emitter->off($handler);

// remove all handlers for an event
$emitter->off(null, 'example');

// remove all handlers for all events
$emitter->off();
```

Emitting an event until:

```
use Webino\EventEmitter;

$emitter = new EventEmitter;

$emitter->on('example', function () {
    return 'Special';
});

$event = $emitter->emit('example', function ($result) {
    // when result meets required condition
    if ('Special' === $result) {
        // stop propagation
        return false;
    }
    // or continue
    return true;
});
```

Event handling priority:

```
use Webino\EventEmitter;

$emitter = new EventEmitter;

$emitter->on('example', function () {
    return 'Begin';
}, $event::BEGIN);

$emitter->on('example', function () {
    return 'Before';
}, $event::BEFORE);

$emitter->on('example', function (Event $event) {
    return 'Main';
}, $event::MAIN);

$emitter->on('example', function () {
    return 'After';
}, $event::AFTER);

$emitter->on('example', function () {
    return 'Finish';
}, $event::FINISH);

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => BeginBeforeMainAfterFinish
```

Event handler:

```
use Webino\EventEmitter;
use Webino\EventHandlerInterface;
use Webino\EventHandlerTrait;

class ExampleEventHandler implements EventHandlerInterface
{
    use EventHandlerTrait;

    protected function initEvents(): void
    {
        $this->on('example', function () {
            return 'Foo';
        });

        $this->on('example', function () {
            return 'Bar';
        });
    }
}

// emitting custom event
$event = $emitter->emit('example');

/** @var \Webino\EventResults $results */
$results = $event->getResults();

echo $results;

// => FooBar
```

API
---

[](#api)

**Event**

- *const* BEGIN
    The beginning priority of the event.
- *const* BEFORE
    Priority before main event.
- *const* MAIN
    Main event priority.
- *const* AFTER
    Priority after main event.
- *const* FINISH
    Priority at the end of the event.
- *const* OFFSET
    Event priority offset.
- *string* getName()
    Get event name.
- *EventEmitterInterface* getTarget()
    Get target object from which event was emitted.
- *mixed* getValue(*string* $name, *mixed* $default = null)
    Get event value by name.
- *void* setValues(*iterable* $values)
    Set event values.
- *EventResults* getResults()
    Returns event results.
- *void* stop(*bool* $stop = true)
    Indicate whether or not to stop this event.
- *bool* isStopped()
    Indicates should stop.

**EventEmitter**

- *void* setEventDispatcher(EventDispatcherInterface $dispatcher)
    Inject event dispatcher.
- *void* on(
    *string|EventInterface|EventHandlerInterface* $event,
    *string|array&lt;int, string&gt;|callable* $callback = null,
    *int* $priority = 1)
    Set event handler.
- *void* off(*callable|EventHandlerInterface* $callback = null, *string|EventInterface* $event = null)
    Remove event handler.
- *EventInterface* emit(*string|EventInterface* $event, *callable* $until = null)
    Invoke handlers.

**EventResults**

- *mixed|null* first()
    Returns first response.
- *mixed|null* last()
    Returns last response.

**EventHandler**

- *void* attachEventEmitter(EventDispatcherInterface $emitter)
    Attach event emitter to handler.
- *void* detachEventEmitter(EventDispatcherInterface $emitter)
    Detach event emitter from handler.

Architecture
------------

[](#architecture)

It is possible to have a global dispatcher to attach event handlers to.

[![event lifecycle](https://raw.githubusercontent.com/webino/event-emitter/develop/docs/EventEmitter.notify.diagram.png "EventEmitter notifies EventDispatcher")](https://raw.githubusercontent.com/webino/event-emitter/develop/docs/EventEmitter.notify.diagram.png)

### Event Lifecycle

[](#event-lifecycle)

The basic idea around events is that we just trigger an event and every action happens in handlers, even the main action. Then we can listen to that event using priorities, if we want to act like a middleware. The event propagation could be stopped at any time.

[![event lifecycle](https://raw.githubusercontent.com/webino/event-emitter/develop/docs/EventEmitter.Event.Lifecycle.diagram.png "Event lifecycle")](https://raw.githubusercontent.com/webino/event-emitter/develop/docs/EventEmitter.Event.Lifecycle.diagram.png)

Using events like *someEvent.pre* and *someEvent.post* or *someEvent.before*, *someEvent.after*, it doesn't matter, is messy and not recommended, don't do that. Give an event a unique name then attach handlers, main action including, using priorities. Convenient way to do that is to use an event [priority constants](#api).

Development
-----------

[](#development)

[![Build Status](https://camo.githubusercontent.com/1b50300bb6afcbceb57e04c5d5ba8d69164c2d95d07159db121e6a2ee94d7338/68747470733a2f2f696d672e736869656c64732e696f2f7472617669732f776562696e6f2f6576656e742d656d69747465722f646576656c6f702e7376673f7374796c653d666f722d7468652d6261646765)](http://travis-ci.org/webino/event-emitter "Develop Build Status")[![Coverage Status](https://camo.githubusercontent.com/75a8d9b2481f0f414e5d91977f04e7dc748bfe321897887ebd7948bed4d6aab9/68747470733a2f2f696d672e736869656c64732e696f2f636f766572616c6c732f6769746875622f776562696e6f2f6576656e742d656d69747465722f646576656c6f702e7376673f7374796c653d666f722d7468652d6261646765)](https://coveralls.io/github/webino/event-emitter?branch=develop "Develop Coverage Status")[![Code Quality](https://camo.githubusercontent.com/c290c78a289d770d1db4c34b830c81d9428f2dd976e60e1839910de51ff57033/68747470733a2f2f696d672e736869656c64732e696f2f7363727574696e697a65722f672f776562696e6f2f6576656e742d656d69747465722f646576656c6f702e7376673f7374796c653d666f722d7468652d6261646765)](https://scrutinizer-ci.com/g/webino/event-emitter/?branch=develop "Develop Code Quality")[![Latest Unstable Version](https://camo.githubusercontent.com/9d0ee231a263d9dcdde550a7f0b1b98dc05938110821736b6093275b07d14041/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f7461672d7072652f776562696e6f2f6576656e742d656d69747465722e7376673f6c6162656c3d50524556494557267374796c653d666f722d7468652d6261646765)](https://packagist.org/packages/webino/event-emitter "Packagist")

Static analysis:

```
composer analyse
```

Coding style check:

```
composer check
```

Coding style fix:

```
composer fix
```

Testing:

```
composer test
```

Git pre-commit setup:

```
ln -s ../../pre-commit .git/hooks/pre-commit
```

Addendum
--------

[](#addendum)

[![License](https://camo.githubusercontent.com/5fd62c0b1bcd42ea510d38ab7d8df0da5c88ce1ee9b75ba34db0d50f25e689ed/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f6c2f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)](https://github.com/webino/event-emitter/blob/master/LICENSE.md "BSD-3-Clause License")[![Total Downloads](https://camo.githubusercontent.com/b0550ae5c55ea3e6ea824035e7f73d0b7a1dff2c78cdda9394792fedef1b831a/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f64742f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)](https://packagist.org/packages/webino/event-emitter "Packagist")[![GitHub code size in bytes](https://camo.githubusercontent.com/ca64c44b0f867315f97a0936d2e700e99d1aba2c9fe357fdc4aa72925937749a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)](https://camo.githubusercontent.com/ca64c44b0f867315f97a0936d2e700e99d1aba2c9fe357fdc4aa72925937749a/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c616e6775616765732f636f64652d73697a652f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)

Please, if you are interested in this library report any issues and don't hesitate to contribute. We will appreciate any contributions on development of this library.

[![GitHub issues](https://camo.githubusercontent.com/ffca08b049ddc556606f3da02e7e869fa9a9a638394b4045155cb8180b98e31d/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f776562696e6f2f6576656e742d656d69747465722e7376673f7374796c653d666f722d7468652d6261646765)](https://github.com/webino/event-emitter/issues)[![GitHub forks](https://camo.githubusercontent.com/25c7d2666efb79cbfa416648dad779fcd745b1a1b2cd18d1113d40f4b317cfb8/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f776562696e6f2f6576656e742d656d69747465722e7376673f6c6162656c3d466f726b267374796c653d666f722d7468652d6261646765)](https://github.com/webino/event-emitter)

###  Health Score

27

—

LowBetter than 49% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity12

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity58

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 ~46 days

Total

3

Last Release

2520d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/c4a88e425997c1af6050f86801610a5291e7ea9f4ad58654df74d9106fb09637?d=identicon)[Webino](/maintainers/Webino)

---

Top Contributors

[![bacinsky](https://avatars.githubusercontent.com/u/3078875?v=4)](https://github.com/bacinsky "bacinsky (36 commits)")

---

Tags

emittereventslibraryv3webinowip

###  Code Quality

Static AnalysisPHPStan

Code StylePHP\_CodeSniffer

Type Coverage Yes

### Embed Badge

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

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

###  Alternatives

[koala-framework/composer-extra-assets

Composer Plugin for installing Assets using native npm/bower

42118.7k11](/packages/koala-framework-composer-extra-assets)[nathancox/codeeditorfield

A field for editing code and JSON in the SilverStripe CMS using Ace Editor (http://ace.c9.io/)

2548.5k5](/packages/nathancox-codeeditorfield)[friendsoftypo3/widgets

Dashboard Widgets Collection

1129.4k](/packages/friendsoftypo3-widgets)

PHPackages © 2026

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