Допустим, у нас есть объект BankCard, являющийся частью Client Aggregate. Клиент может захотеть аннулировать свою банковскую карту.
class CancellBankCardCommandHandler
{
public function Execute(CancelBankCardCommand $command)
{
$client = $this->_repository->get($command->clienId);
$bankCard = $client->getBankCard($command->bankCardId);
$bankCard->clientCancelsBankCard();
$this->_repository->add($client);
}
}
class BankCard implements Entity
{
// constructor and some other methods ...
public function clientCancelsBankCard()
{
$this->apply(new BankCardWasCancelled($this->id);
}
}
class Client implements AggregateRoot
{
protected $_bankCards;
public function getBankCard($bankCardId)
{
if (!array_key_exists($bankCardId, $this->_bankCards) {
throw new DomainException('Bank card is not found!');
}
return $this->_bankCard[$bankCardId]);
}
}
Наконец, у нас есть экземпляр репозитория домена, который отвечает за хранение агрегатов.
class ClientRepository implements DomainRepository
{
// methods omitted
public function add($clientAggregate)
{
// here we somehow need to store BankCardWasCancelled event
// which is a part of BankCard Entity
}
}
Мой вопрос заключается в том, отвечает ли AggregateRoot за отслеживание событий своих сущностей или нет. Можно ли получить события Сущности, которая является частью Агрегата, из его Агрегата или нет?
Как на самом деле сохранить Клиента со всеми изменениями, внесенными в банковскую карту, сохранив ее целостность?