gpslab / domain-event
创建 DDD 应用领域层的工具
v2.2.0
2019-08-06 12:28 UTC
Requires
- php: >=5.5.0
Requires (Dev)
- php-amqplib/php-amqplib: ^2.9
- phpunit/phpunit: 4.8.*
- predis/predis: ~1.0|~1.1
- psr/container: ~1.0
- psr/log: ~1.0
- satooshi/php-coveralls: ^2.0
- scrutinizer/ocular: ~1.5
- symfony/dependency-injection: ~2.3|~3.0|~4.0
- symfony/serializer: ~2.3|~3.0|~4.0
README
领域事件
创建 DDD 应用领域层的库 领域驱动设计 (DDD)
安装
使用 Composer 非常简单,运行
composer require gpslab/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; } }
引发事件
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(); } }
创建监听器
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() )); } }
派发事件
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);
文档
- 基本用法
- 在自身中引发事件
- 监听器
- 创建监听器
- 创建订阅者
- 定位器
- 直接绑定定位器
- PSR-11 容器定位器 (PSR-11)
- Symfony 容器定位器 (Symfony 3.3 实现 PSR-11)
- 队列
- 框架
- 中间件
- 有效载荷
许可证
此扩展包受 MIT 许可证 保护。完整的许可证请参阅文件:LICENSE