ormin / mapping-domain-events-handler
一组类,允许你在持久化状态变化的同时,利用和使用领域事件的好处
dev-master
2015-11-24 17:53 UTC
Requires
- broadway/broadway: >=0.7.0
Requires (Dev)
- phpspec/phpspec: ^2.3
This package is not auto-updated.
Last update: 2024-10-02 18:02:18 UTC
README
允许您将领域事件映射到原子调用,这将持久化所需事件的状态变化。如果您没有或无法将事件溯源集成到系统中,但想利用领域事件作为代码中变化的主要来源,则此功能很有用
要安装它,请使用Composer
$ composer require --dev ormin/mapping-domain-events-handler:dev-master
要使用它,将EventBasedRepository类注入到您的领域仓库实现中,并传递AggregateRoot以保存
class Member implements AggregateRoot { ... }
class DBALMemberRepository implements MemberRepository {
private $repository;
public function __construct(EventBasedRepository $repository) {
$this->repository = $repository;
}
public function save(Member $aggregateRoot) {
$this->repository->save($aggregateRoot);
}
}
对于每个聚合,您需要实例化一个EventBasedRepository,并使用事件存储实现。该项目附带SimpleMappingEventStore,它将事件映射到POPO对象的调用。创建POPO处理器对象,并使用构造函数参数将其注入SimpleMappingEventStore中
class UserAddedAProductToBasket { ... }
class DBALMappingMemberEventStore {
public function handleUserAddedAProductToBasket() {
//Handle persisting of state of what happened within the aggregate
$statement = $this->connection->prepare("INSERT INTO ...");
}
}
class User extends EventSourcedAggregateRoot {
public function addToBasket(Product $product) {
$this->apply(new UserAddedAProductToBasket($product));
}
public function handleUserAddedAProductToBasket(UserAddedAProductToBasket $event) {
//Handle the event within the aggregate
}
//When this aggregate will be sent for saving, its uncommitted events' will be sent to event store and mapped to the DBALMappingMemberEventStore::handleUserAddedAProductToBasket()
}