PHP code example of webit / message-bus-sf-event-dispatcher
1. Go to this page and download the library: Download webit/message-bus-sf-event-dispatcher library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
webit / message-bus-sf-event-dispatcher example snippets
use Symfony\Component\EventDispatcher\Event;
class Event1 extends Event
{
private $x;
public function __construct($x) {
$this->x = $x;
}
public function x()
{
return $this->x;
}
}
class Event2 extends Event
{
private $y;
private $z;
public function __construct($y, $z) {
$this->y = $y;
$this->z = $z;
}
public function y()
{
return $this->y;
}
public function z()
{
return $this->z;
}
}
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\Event\MessageBusEventFactory;
class MessageBusEvent1Factory implements MessageBusEventFactory
{
public function create(Message $message): MessageBusEventFactory
{
$arContent = json_decode($message->content(), true);
return new MessageBusEvent(
$message->type(),
new Event1(isset($arContent['x']) ? $arContent['x'] : '')
);
}
}
class MessageBusEvent2Factory implements MessageBusEventFactory
{
public function create(Message $message): MessageBusEventFactory
{
$arContent = json_decode($message->content(), true);
return new MessageBusEvent(
$message->type(),
new Event2(
isset($arContent['y']) ? $arContent['y'] : '',
isset($arContent['z']) ? $arContent['z'] : '',
)
);
}
}
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\Event\ByMessageTypeMessageBusEventFactory;
$messageBusEventFactory = new ByMessageTypeMessageBusEventFactory([
'type-1' => new MessageBusEvent1Factory(),
'type-2' => new MessageBusEvent2Factory()
]);
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\Event\Symfony\CallbackSymfonyEventFactory;
$eventFactory1 = new CallbackSymfonyEventFactory(
function (Message $message) {
$arContent = json_decode($message->content(), true);
return new MessageBusEvent(
$message->type(),
new Event1(isset($arContent['x']) ? $arContent['x'] : '')
);
}
);
$eventFactory2 = new CallbackSymfonyEventFactory(
function (Message $message) {
$arContent = json_decode($message->content(), true);
return new MessageBusEvent(
$message->type(),
new Event2(
isset($arContent['y']) ? $arContent['y'] : '',
isset($arContent['z']) ? $arContent['z'] : '',
)
);
}
);
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\Event\GenericMessageBusEventFactory;
$messageBusEventFactory1 = new GenericMessageBusEventFactory(
$eventFactory1,
new FromMessageTypeEventNameResolver() // optional, used be default, you can provide a different implemenation
);
$messageBusEventFactory2 = new GenericMessageBusEventFactory(
$eventFactory2
);
// combine both factories together
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\Event\ByMessageTypeMessageBusEventFactory;
$messageBusEventFactory = new ByMessageTypeMessageBusEventFactory([
'type-1' => $messageBusEventFactory1,
'type-2' => $messageBusEventFactory2
]);
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Publisher\EventDispatcherPublisher;
use Webit\MessageBus\Message;
use Symfony\Component\EventDispatcher\EventDispatcher;
$eventDispatcher = new EventDispatcher();
$publisher = new EventDispatcherPublisher(
$eventDispatcher,
$messageBusEventFactory
);
$message = new Message('type-1', '{"x":"some-x"}');
$publisher->publish($message); // will be dispatched as "event-1" and event of "Event1" class
$message = new Message('type-2', '{"y":"some-y","z":"some-z"}');
$publisher->publish($message); // will be dispatched as "event-1" and event of "Event1" class
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\Message\Content\EventSerialiser;
use Symfony\Component\EventDispatcher\Event;
class Event1Serializer implements EventSerialiser
{
public function serialise(MessageBusEvent $event): string
{
$symfonyEvent = $event->event();
if ($symfonyEvent instanceof Event1) {
return json_encode(['x' => $symfonyEvent->x()]);
}
throw new \InvalidArgumentException('Event must be an instance of Event1.');
}
}
use JMS\Serializer\SerializerBuilder;
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\Message\Content\JmsEventSerialiser;
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\Message\Content\EventOnlySerialisationDataProvider;
$serializerBuilder = SerializerBuilder::create();
// configure Serializer
$serializer = $serializerBuilder->build();
$jsmEventSerialiser = new JmsEventSerialiser(
$serializer,
new EventOnlySerialisationDataProvider(), // used by default, provides data to be passed to the JMSSerializer,
JmsEventSerialiser::FORMAT_JSON // JSON by default, can be JmsEventSerialiser::FORMAT_XML as well
);
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\Message\MessageAwareEvent;
use Symfony\Component\EventDispatcher\Event;
class EventX extends Event implements MessageAwareEvent
{
public function createMessage(string $eventName): Message
{
return new Message($eventName, json_decode(['some'=>'stuff']));
}
}
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\Message\ByEventNameMessageFromEventFactory;
$messageFactory = new ByEventNameMessageFromEventFactory([
'type-1' => new GenericMessageFromEventFactory(
new Event1Serializer()
),
'type-2' => new GenericMessageFromEventFactory($jsmEventSerialiser)
]);
use Webit\MessageBus\Infrastructure\Symfony\EventDispatcher\Listener\EventConsumingListener;
$listener = new EventConsumingListener(
new VoidConsumer(),
$messageFactory
);
$eventDispatcher->addListener('type-1', $listener);
$eventDispatcher->addListener('type-2', $listener);
// will produce new Message('type-1', '{"x":"xxx"}') and pass to the consumer
$eventDispatcher->dispatch('type-1', new Event1('xxx'));
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.