gpslab/domain-event
Composer 安装命令:
composer require gpslab/domain-event
包简介
Tools to create the domain layer of your DDD application
README 文档
README
Domain event
Library to create the domain layer of your Domain-driven design (DDD) application
Installation
Pretty simple with Composer, run:
composer require gpslab/domain-event
Base usage
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);
Documentation
- Base usage
- Raise events in self
- Listener
- Create listener
- Create subscriber
- Locator
- Queue
- Frameworks
- Middleware
- Payload
License
This bundle is under the MIT license. See the complete license in the file: LICENSE
gpslab/domain-event 适用场景与选型建议
gpslab/domain-event 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 29.48k 次下载、GitHub Stars 达 19, 最近一次更新时间为 2016 年 09 月 29 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「symfony」 「predis」 「AMQP」 「ddd」 「infrastructure」 「domain-event」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 gpslab/domain-event 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 gpslab/domain-event 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 gpslab/domain-event 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
Queue
Work with RabbitMQ in Laravel.
Asynchronous version of Predis
PHP AMQP Binding Library
The bundle for easy using json-rpc api on your project
The Listener component of the RabbitEvents library.
统计信息
- 总下载量: 29.48k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 19
- 点击次数: 21
- 依赖项目数: 3
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2016-09-29