Presentation from Uszanowanko Programowanko meetup - http://www.uszanowanko.pl/z-biblioteki-cechu-ubijacza-potworow
Daniel Stokowiec - Nie wszystko, co ubite, w ziemi zostaje
O tym, jak znajomość zdarzeń pomaga w walce ze zmorami i potworami, czyli wprowadzenie do Event Sourcing
Nie wszystko, co ubite, w ziemi zostaje. Wprowadzenie do Event Sourcing
1. Nie wszystko co ubite,
w ziemi zostaje.
O tym jak znajomość zdarzeń pomaga w walce ze zmorami i
potworami; czyli wprowadzenie do Event Sourcing.
Daniel Stokowiec
stodan@tsh.io
9. class CreateContractCommand
{
private $contractId;
private $ownerId;
private $message;
public function __construct($contractId, $ownerId, $message)
{
$this->contractId = $contractId;
$this->ownerId = $ownerId;
$this->message = $message;
}
public function getContractId() {}
public function getOwnerId() {}
public function getMessage() {}
}
10. use BroadwayCommandHandlingCommandHandler;
use BroadwayEventSourcingEventSourcingRepository;
class CreateContractCommandHandler extends CommandHandler
{
public function __construct(
EventSourcingRepository $repository)
{
$this->repository = $repository;
}
public function handleCreateContractCommand(
CreateContractCommand $command)
{
$contract = Contract::create(
$command->getContractId(),
$command->getOwnerId(),
$command->getMessage()
);
$this->repository->save($contract);
}
}
11. use BroadwayEventSourcingEventSourcedAggregateRoot;
class Contract extends EventSourcedAggregateRoot
{
private $contractId;
private $ownerId;
public function getAggregateRootId() {
return $this->contractId;
}
public static function create($invitationId, $ownerId,
$message) {
$contract = new Contract();
$contract->apply(new ContractCreatedEvent(
$contractId, $ownerId, $message));
return $contract;
}
protected function applyContractCreatedEvent(
ContractCreatedEvent $event) {
$this->contractId = $event->contractId;
$this->ownerId = $event->ownerId;
}
}
12. use BroadwayReadModelProjector;
use BroadwayReadModelRepositoryInterface;
class ContractProjector extends Projector
{
private $repository;
public function __construct(RepositoryInterface $repository) {
$this->repository = $repository;
}
protected function applyContractCreatedEvent(
ContractCreatedEvent $event) {
$contract = new Contract($event->getContractId());
$contract->setMessage($event->getMessage());
$this->repository->save($contract);
}
protected function applyContractMessageUpdatedEvent(
ContractMessageUpdated $event) {
$contract = $this->repository->find(
$event->getContractId());
$contract->setMessage($event->getMessage());
$this->repository->save($contract);
}
}
13. Pełna historia zdarzeń
Brak komplikacji w domenie*
Brak komplikacji na warstwie bazodanowej
Nie zapomniałeś o niczym, możesz spać spokojnie
14. Jaskier na pomoc
Historia modyfikacji zlecenia
Szczegółowy audit trail
Bezproblemowe rozgłaszanie
informacji
16. Gryfa w powietrzu ślady
Gwarancja bezpieczeństwa
powiązanych danych
Zmiana informacji o ostatnim
spostrzeżeniu na ogłoszeniu
Jak dodać funkcjonalność
przedstawiania lokacji na
mapie?
17. Doppler niestraszny
Swoboda w doborze
odpowiednich baz danych
Dedykowane bazy na potrzeby
integracji
Możliwość eksperymentowania