ormin/mapping-domain-events-handler

一组类,允许你在持久化状态变化的同时,利用和使用领域事件的好处

dev-master 2015-11-24 17:53 UTC

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()

}