https://github.com/gpslab/domain-event
Library to create the domain layer of your DDD application
https://github.com/gpslab/domain-event
ddd domain-event infrastructure php predis symfony
Last synced: 12 months ago
JSON representation
Library to create the domain layer of your DDD application
- Host: GitHub
- URL: https://github.com/gpslab/domain-event
- Owner: gpslab
- License: mit
- Created: 2016-09-29T09:27:56.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2019-12-23T07:59:48.000Z (over 6 years ago)
- Last Synced: 2025-03-26T20:21:18.606Z (12 months ago)
- Topics: ddd, domain-event, infrastructure, php, predis, symfony
- Language: PHP
- Homepage:
- Size: 208 KB
- Stars: 19
- Watchers: 1
- Forks: 2
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://packagist.org/packages/gpslab/domain-event)
[](https://packagist.org/packages/gpslab/domain-event)
[](https://packagist.org/packages/gpslab/domain-event)
[](https://travis-ci.org/gpslab/domain-event)
[](https://coveralls.io/github/gpslab/domain-event?branch=master)
[](https://scrutinizer-ci.com/g/gpslab/domain-event/?branch=master)
[](https://styleci.io/repos/69552555)
[](https://github.com/gpslab/domain-event)
Domain event
============
Library to create the domain layer of your [Domain-driven design (DDD)](https://en.wikipedia.org/wiki/Domain-driven_design) application
## Installation
Pretty simple with [Composer](http://packagist.org), run:
```sh
composer require gpslab/domain-event
```
## Base usage
Create a domain event
```php
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
```php
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
```php
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
```php
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);
```
## Documentation
* [Base usage](docs/base.md)
* [Raise events in self](docs/raise_in_self.md)
* Listener
* [Create listener](docs/listener/listener.md)
* [Create subscriber](docs/listener/subscriber.md)
* Locator
* [Direct binding locator](docs/listener/locator/direct_binding.md)
* [PSR-11 Container locator](docs/listener/locator/psr-11_container.md) *([PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md))*
* [Symfony container locator](docs/listener/locator/symfony_container.md) *(Symfony 3.3 [implements](http://symfony.com/blog/new-in-symfony-3-3-psr-11-containers) a [PSR-11](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-11-container.md))*
* [Queue](docs/queue/queue.md)
* [Queue event bus](docs/queue/bus.md)
* [Pull](docs/queue/pull/pull.md)
* [Memory queue](docs/queue/pull/memory.md)
* [Predis queue](docs/queue/pull/predis.md)
* [Subscribe](docs/queue/subscribe/subscribe.md)
* [Executing queue](docs/queue/subscribe/executing.md)
* [AMQP queue](docs/queue/subscribe/amqp.md)
* [Predis queue](docs/queue/subscribe/predis.md)
* Serialize command
* [Simple payload serializer](docs/queue/serialize/simple.md)
* [Optimized Symfony serializer](docs/queue/serialize/optimized.md)
* [Payload Symfony serializer](docs/queue/serialize/payload.md)
* Frameworks
* [Symfony bundle](https://github.com/gpslab/domain-event-bundle)
* [Middleware](https://github.com/gpslab/middleware)
* [Payload](https://github.com/gpslab/payload)
## License
This bundle is under the [MIT license](http://opensource.org/licenses/MIT). See the complete license in the file: LICENSE