Library to create the domain layer of your Domain-driven design (DDD) application
Pretty simple with Composer, run:
composer require gpslab/domain-event
Create a domain event
use GpsLab\Domain\Event\Event;
final class PurchaseOrderCreatedEvent implements Event
{
private $customer_id;
private $create_at;
public function __construct(CustomerId $customer_id, \DateTimeImmutable $create_at)
{
$this->customer_id = $customer_id;
$this->create_at = $create_at;
}
public function customerId()
{
return $this->customer_id;
}
public function createAt()
{
return $this->create_at;
}
}
Raise your event
use GpsLab\Domain\Event\Aggregator\AbstractAggregateEvents;
final class PurchaseOrder extends AbstractAggregateEventsRaiseInSelf
{
private $customer_id;
private $create_at;
public function __construct(CustomerId $customer_id)
{
$this->raise(new PurchaseOrderCreatedEvent($customer_id, new \DateTimeImmutable()));
}
/**
* The raise() method will automatically call this method.
* Since it's an event you should never do some tests in this method.
* Try to think that an Event is something that happened in the past.
* You can not modify what happened. The only thing that you can do is create another event to compensate.
* You do not obliged to listen this event and are not required to create this method.
*/
protected function onPurchaseOrderCreated(PurchaseOrderCreatedEvent $event)
{
$this->customer_id = $event->customerId();
$this->create_at = $event->createAt();
}
}
Create listener
class SendEmailOnPurchaseOrderCreated
{
private $mailer;
public function __construct($mailer)
{
$this->mailer = $mailer;
}
public function __invoke(PurchaseOrderCreatedEvent $event)
{
$this->mailer->send('recipient@example.com', sprintf(
'Purchase order created at %s for customer #%s',
$event->createAt()->format('Y-m-d'),
$event->customerId()
));
}
}
Dispatch events
use GpsLab\Domain\Event\Bus\ListenerLocatedEventBus;
use GpsLab\Domain\Event\Listener\Locator\DirectBindingEventListenerLocator;
// first the locator
$locator = new DirectBindingEventListenerLocator();
// you can use several listeners for one event and one listener for several events
$locator->register(PurchaseOrderCreatedEvent::class, new SendEmailOnPurchaseOrderCreated(/* $mailer */));
// then the event bus
$bus = new ListenerLocatedEventBus($locator);
// do what you need to do on your Domain
$purchase_order = new PurchaseOrder(new CustomerId(1));
// this will clear the list of event in your AggregateEvents so an Event is trigger only once
$bus->pullAndPublish($purchase_order);
- Base usage
- Raise events in self
- Listener
- Create listener
- Create subscriber
- Locator
- Queue
- Frameworks
- Middleware
- Payload
This bundle is under the MIT license. See the complete license in the file: LICENSE