Event manager¶
The simple realization of the subject/observer pattern which allows to attach and detach listeners to named events. Generally speaking it a good way to communicate with all your components across the project and do not communicate with they directly.
Installation¶
Run the following to install this library:
$ composer require esase/tiny-event-manager
Simple event¶
This kind of event is used to notify your subscribers about an action or pass a value through the chain of subscriber in order to modify it.
Simple example¶
<?php
use Tiny\EventManager\Event;
use Tiny\EventManager\EventManager;
use Tiny\ServiceManager\ServiceManager;
$event = new Event([
'id' => 1,
'user_name' => 'tester',
'email' => 'tester@gmail.com'
]);
$eventManager = new EventManager(
new ServiceManager()
);
// notify subscribers about the action
$eventManager->trigger('user.created.event', $event);
...
// we expect to get either the initial data or modified one
print_r($event->getData());
Collection event¶
The collection event is used to fetch some list of data from it’s subscribers. List of configs e.g:
Collection example¶
<?php
use Tiny\EventManager\Event;
use Tiny\EventManager\EventManager;
use Tiny\ServiceManager\ServiceManager;
$event = new EventCollection();
$eventManager = new EventManager(
new ServiceManager()
);
$eventManager->trigger('core.config_list.event', $event);
...
// we expect to get an array of configs (not a single value) received from subscribers
print_r($event->getData());
Event manager¶
The event manager provides a few helpful methods for registering, removing subscribers and trigger events as well.
Subscribe / unsubscribe example¶
<?php
use Tiny\EventManager\Event;
use Tiny\EventManager\EventManager;
use Tiny\ServiceManager\ServiceManager;
$eventManager = new EventManager(
// you may pass any other "PSR"'s compatible container here
new ServiceManager()
);
// subscribe to some events
// we need to pass a listener class name and priority (optional)
$eventManager->subscribe('user.created.event', TestUserCreatedEvent::class, 100);
$eventManager->subscribe('user.deleted.event', TestUserDeletedEvent::class, 100);
// we don't want to listen the "user.deleted.event" event any more
$eventManager->unsubscribe('user.deleted.event', TestUserDeletedEvent::class);
The priority is used to manage the exact order of listeners execution, if you need you that your listener will be executed first you need to specify a lower priority than other listeners do
Complete example¶
<?php
use Tiny\EventManager\Event;
use Tiny\EventManager\EventManager;
use Tiny\ServiceManager\ServiceManager;
$eventManager = new EventManager(
new ServiceManager()
);
// we need to know when new users are created
$eventManager->subscribe('user.created.event', TestUserCreatedEvent::class);
// notify subscribers about a new user
$event = new Event([
'id' => 1,
'user_name' => 'tester',
'email' => 'tester@gmail.com'
]);
$eventManager->trigger('user.created.event', $event);
// the event's handler
class TestUserCreatedEvent
{
public function __invoke(Event $event)
{
// prints: [ 'id' => 1, 'user_name' => 'tester','email' => 'tester@gmail.com']
print_r($event->getData());
// we even may change the event's data
$event->setData(array_merge(
$event->getData(),
[
'creation_time' => time() // add a new property
]
));
// we also my stop the full chain of the listeners (other listeners will not be invoked)
$event->setStopped();
// or do other logic ...
}
}
// prints: [ 'id' => 1, 'user_name' => 'tester','email' => 'tester@gmail.com', 'creation_time' => '...']
print_r($event->getData());
PS: In our case all event’s handlers should be registered as services in the ServiceManager otherwise they will not be invoked.