Event Manager

Note: The event manager is part of the Berlioz ecosystem but is available as a standalone package: berlioz/event-manager. You can find it on Packagist. You can use it independently of the framework, in any PHP application.

Berlioz Event Manager is a PHP event manager/dispatcher, respecting PSR-14 (Event Dispatcher) standard.

Dispatcher

To initialize the event dispatcher:

use Berlioz\EventManager\EventDispatcher;

$dispatcher = new EventDispatcher();

To listen an event:

use Berlioz\EventManager\EventDispatcher;

$callback = function($event) {
    // Do something
    return $event;
};

/** @var EventDispatcher $dispatcher */

// A named event
$dispatcher->addEventListener('event.name', $callback);

// Your event object
$dispatcher->addEventListener(MyEvent::class, $callback);

To dispatch an event:

/** @var EventDispatcher $dispatcher */
use Berlioz\EventManager\Event\CustomEvent;
use Berlioz\EventManager\EventDispatcher;

// A named event
$dispatcher->dispatch(new CustomEvent('event.name'));

// Your event object
$dispatcher->dispatch(new MyEvent());

Priority

You can define a priority in your listeners. The highest priority is in the first executions.

use Berlioz\EventManager\Listener\ListenerInterface;

/** ... */

// Normal priority (0)
$dispatcher->addEventListener('event.name', $callback, ListenerInterface::PRIORITY_NORMAL);
// High priority (100)
$dispatcher->addEventListener('event.name', $callback, ListenerInterface::PRIORITY_HIGH);
// Low priority (-100)
$dispatcher->addEventListener('event.name', $callback, ListenerInterface::PRIORITY_LOW);

The priority argument is an integer ; you can so define your priority with integer value instead of constant.

Add delegate dispatcher

You can delegate dispatch to another dispatcher who respects PSR-14. The delegated dispatchers are called after, only if event isn’t stopped.

use Berlioz\EventManager\EventDispatcher;

$dispatcher = new EventDispatcher();
$dispatcher->addEventDispatcher(new MyCustomDispatcher());

Add listener provider

You can add listener providers. Providers are called in the order of addition.

use Berlioz\EventManager\EventDispatcher;

$dispatcher = new EventDispatcher();
$dispatcher->addListenerProvider(new MyListenerProvider());

Default listener

The default listener is \Berlioz\EventManager\Listener\Listener. You can define your own default provider, he must implement \Berlioz\EventManager\Listener\ListenerInterface interface.

To declare this into the dispatcher:

use Berlioz\EventManager\EventDispatcher;
use Berlioz\EventManager\Provider\ListenerProvider;

$myDefaultProvider = new ListenerProvider();

$dispatcher = new EventDispatcher(defaultProvider: $myDefaultProvider);

Trigger convenience method

The trigger() method is a shortcut to dispatch a string-named event without manually constructing a CustomEvent:

/** @var EventDispatcher $dispatcher */
$event = $dispatcher->trigger('user.registered', ['userId' => 42]);

// Equivalent to:
$event = $dispatcher->dispatch(new CustomEvent('user.registered', ['userId' => 42]));

// Access data from the event:
$event->getData(); // ['userId' => 42]

Subscribers

Subscribers group multiple listeners in a single class. They are lazily activated: listeners are registered only when a matching event is dispatched.

Create a subscriber by implementing SubscriberInterface or extending AbstractSubscriber:

use Berlioz\EventManager\Provider\ListenerProviderInterface;
use Berlioz\EventManager\Subscriber\AbstractSubscriber;

class UserSubscriber extends AbstractSubscriber
{
    protected array $listens = ['user.registered', 'user.deleted'];

    public function subscribe(ListenerProviderInterface $provider): void
    {
        $provider->addEventListener('user.registered', [$this, 'onUserRegistered']);
        $provider->addEventListener('user.deleted', [$this, 'onUserDeleted']);
    }

    public function onUserRegistered($event): void
    {
        // Handle user registration
    }

    public function onUserDeleted($event): void
    {
        // Handle user deletion
    }
}

Register a subscriber:

/** @var EventDispatcher $dispatcher */
$dispatcher->addSubscriber(new UserSubscriber());

Advanced dispatch behaviors

Some advanced behaviors are available during dispatch:

  • If a listener returns false, the propagation is stopped immediately.
  • If a listener returns a different event object, it is recursively dispatched and its result is returned.
  • If a listener returns the same event object (mutated), subsequent listeners receive the mutated event.

Last updated: Wed, 18 Feb 2026 11:34