1. Go to this page and download the library: Download agluh/outbox-bundle 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/ */
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use AGluh\Bundle\OutboxBundle\Event\AggregateRootPreparedForPersistenceEvent;
use AGluh\Bundle\OutboxBundle\Event\DomainEventPreparedForPersistenceEvent;
use AGluh\Bundle\OutboxBundle\Event\DomainEventEnqueuedForPublishingEvent;
use AGluh\Bundle\OutboxBundle\Event\DomainEventPublishedEvent;
class OutboxIntegrationEventsListener implements EventSubscriberInterface
{
/**
* In this method you should collect domain events from your aggregate root
* and than call $event->addDomainEvent() to persist them to outbox.
*/
public function onAggregateRootPreparedForPersistence (AggregateRootPreparedForPersistenceEvent $event): void
{
$aggregateRoot = $event->aggregateRoot();
/**
* Example: DomainEventPublisher is a base class or an interface
* of your aggregate.
*/
if($aggregateRoot instanceof DomainEventPublisher) {
/**
* Here DomainEventPublisher::popEvents() is the method
* that returns array of domain events for aggregate.
*/
foreach ($aggregateRoot->popEvents() as $domainEvent) {
/**
* Basically domain event can be any PHP type that supports serialization.
* See Serialization section below in docs.
*/
$event->addDomainEvent($domainEvent);
}
}
}
/**
* In this method you can alter date of expected publication for domain event.
* By default it will be the date of registration of the event in outbox.
*/
public function onDomainEventPreparedForPersistence(DomainEventPreparedForPersistenceEvent $event): void
{
$domainEvent = $event->domainEvent();
/**
* Here DomainEvent is an interface or base class for your domain event.
*/
if($domainEvent instanceof DomainEvent) {
/**
* In this example we use event occurrence date as date of expected publication.
*/
$event->changeExpectedPublicationDate($domainEvent->occurrenceDate());
}
}
/**
* This function will be called by outbox bundle for each domain event should be published.
*/
public function onDomainEventEnqueuedForPublishing(DomainEventEnqueuedForPublishingEvent $event): void
{
// It makes sense to stop propagation for event
$event->stopPropagation();
$domainEvent = $event->domainEvent();
// Do whatever you mention under 'publish event' here. For example, send message to RabbitMQ.
// You MUST set publication date here to mark event as published in outbox table.
$event->setPublicationDate(new \DateTimeImmutable());
}
/**
* This function will be called after outbox bundle persists domain event as published.
*/
public function onDomainEventPublished(DomainEventPublishedEvent $event): void
{
// Do something if you want
}
public static function getSubscribedEvents(): array
{
return [
AggregateRootPreparedForPersistenceEvent::class => 'onAggregateRootPreparedForPersistence',
DomainEventPreparedForPersistenceEvent::class => 'onDomainEventPreparedForPersistence',
DomainEventEnqueuedForPublishingEvent::class => 'onDomainEventEnqueuedForPublishing',
DomainEventPublishedEvent::class => 'onDomainEventPublished'
];
}
}
namespace App\Service;
use AGluh\Bundle\OutboxBundle\Serialization\SerializerInterface;
use AGluh\Bundle\OutboxBundle\Exception\DomainEventDecodingFailedException;
class CustomSerializer implements SerializerInterface
{
private \Symfony\Component\Serializer\SerializerInterface $serializer;
// Constructor skipped
public function encode($domainEvent): string
{
return $this->serializer->serialize($domainEvent, 'json');
}
/**
* @throws DomainEventDecodingFailedException
*/
public function decode(string $data)
{
// In this example we don't convert json back to an object and simply use it further
return $data;
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.