Event Dispatcher

Many applications develop a system that allows for code behavior change without modifying the core. Many of these systems will implement the observer pattern or the mediator pattern.

Devflow’s event dispatcher implements the observer pattern. Create custom events and listeners that allows components in your project to react if something occurs.

The event dispatcher contains three elements: the event, the listener, and the dispatcher. The dispatcher class raises events that the listeners throughout the system will listen for or subscribe to.

Please note that the event dispatcher is different from the Event Bus for domain events.

The following example should help explain in more detail on how to use the event dispatcher. This example shows how to use it to send an email after a user registers to a site.

First we need an event class:

<?php

use Qubus\EventDispatcher\GenericEvent;

final class MessageSent extends GenericEvent
{
    public const EVENT_NAME = self::class;

    public function getName(): string
    {
        return self::EVENT_NAME;
    }
    public function message(): string
    {
        return 'Congrats! Your account was created successfully.';
    }
}

Next, you could create a listener or subscriber. For this example, I am going to use a subscriber. Subscribers allow you to group together events rather than just one event via a listener.

<?php

use Qubus\EventDispatcher\Event;
use Qubus\EventDispatcher\EventSubscriber;

final class MessageSentSubscriber implements EventSubscriber
{

    public static function getSubscribedEvents(): array
    {
        return [
            MessageSent::class => 'onMessageSent',
        ];
    }

    public function onMessageSent(Event $event)
    {
        echo $event->message();
    }
}

The MessageSentSubscriber class implements the EventSubscriber interface which needs to implement the getSubscribedEvents method. The getSubscribedEvents method should return an array of events you want it to be subscribed to. For the array, the key is the event name (MessageSent::class) and the value is the method that should be called when the event is triggered, also know as the listener method.

Now that we have our classes in place, create a file called subscriber_event.php and add the following:

<?php

require('vendor/autoload.php');

use Qubus\EventDispatcher\Dispatcher;
use Qubus\EventDispatcher\Event;
use Qubus\EventDispatcher\EventSubscriber;
use Qubus\EventDispatcher\GenericEvent;
use Qubus\Exception\Data\TypeException;

// init the event dispatcher
$dispatcher = new Dispatcher();

// register the subscriber
$subscriber = new MessageSentSubscriber();
try {
    $dispatcher->addSubscriber($subscriber);
} catch (TypeException $e) {
    return $e->getMessage();
}

// dispatch
$dispatcher->dispatch(MessageSent::class, new MessageSent());

When you type out the following command php subscriber_event.php via a terminal and hit return, you should see your message: Congrats! Your account was created successfully.

Working with an event dispatcher might not seem as simple as a hook/plugin system like you find in a CMS like WordPress, but once you get the hang of it, you will see that it is pretty powerful.