diff --git a/app/AggregateHistory.php b/app/AggregateHistory.php index d47123930ebdf0958a03ff8d14464885756d424c..b34b1faa175cf3d49e6f034339304fdbd72338fa 100644 --- a/app/AggregateHistory.php +++ b/app/AggregateHistory.php @@ -1,4 +1,5 @@ <?php +use Ramsey\Uuid\UuidInterface; /** * Collection of domain events @@ -7,7 +8,7 @@ class AggregateHistory extends ArrayObject { private $aggregateId; - public function __construct($aggregateId, DomainEvents $domainEvents) + public function __construct(UuidInterface $aggregateId, DomainEvents $domainEvents) { $this->aggregateId = $aggregateId; @@ -17,10 +18,7 @@ class AggregateHistory extends ArrayObject { parent::__construct((array) $domainEvents); } - /** - * @return array|null|object - */ - public function getAggregateId() + public function getAggregateId(): UuidInterface { return $this->aggregateId; } diff --git a/app/AggregatePersister.php b/app/AggregatePersister.php new file mode 100644 index 0000000000000000000000000000000000000000..4b68e95b6b005916b096d5341659711709c20de8 --- /dev/null +++ b/app/AggregatePersister.php @@ -0,0 +1,14 @@ +<?php + +use Ramsey\Uuid\UuidInterface; + +class AggregatePersister +{ + public function save(string $aggregateRoot, AbstractAggregate $aggregate) : void { + + } + + public function load(string $aggregateRoot, UuidInterface $id): AbstractAggregate { + + } +} \ No newline at end of file diff --git a/app/RecordsEvents.php b/app/RecordsEvents.php index e0e73610a8a2a644a6dbb9c1212cadc6ba04536b..c1c34584f7afff0ab96254be69850fbb01037a88 100644 --- a/app/RecordsEvents.php +++ b/app/RecordsEvents.php @@ -2,7 +2,7 @@ interface RecordsEvents { - public function getRecordedEvents(); + public function getRecordedEvents(): DomainEvents; public function clearRecordedEvents(); } \ No newline at end of file diff --git a/app/aggreagates/AbstractAggregate.php b/app/aggreagates/AbstractAggregate.php index ea6c001d1b5d22f7ff1e4bd8f515b28e4d039d3d..b0a8f837b9d131d140f38a82955920153c3cf4ef 100644 --- a/app/aggreagates/AbstractAggregate.php +++ b/app/aggreagates/AbstractAggregate.php @@ -7,7 +7,7 @@ abstract class AbstractAggregate * @param \DomainEvent $domainEvent * @return string */ - private function getApplyMethodForDomainEvent(DomainEvent $domainEvent) + private function getApplyMethodForDomainEvent(DomainEvent $domainEvent): string { return "apply" . get_class($domainEvent); } @@ -17,7 +17,8 @@ abstract class AbstractAggregate * @param \DomainEvent $domainEvent * @internal */ - public function applyIfAccepts(DomainEvent $domainEvent) { + public function applyIfAccepts(DomainEvent $domainEvent) + { if(method_exists($this, $this->getApplyMethodForDomainEvent($domainEvent))) { $this->apply($domainEvent); } @@ -27,7 +28,8 @@ abstract class AbstractAggregate * Apply domain event; if objects does not accepts this event -> fail * @param \DomainEvent $domainEvent */ - public function apply(DomainEvent $domainEvent) { + public function apply(DomainEvent $domainEvent) + { $method = $this->getApplyMethodForDomainEvent($domainEvent); $this->$method($domainEvent); } diff --git a/app/aggreagates/Basket.php b/app/aggreagates/Basket.php index 8d1a7ebe5f1674adf77b9d25bc213459284337d6..6a9706d9557d321de978f23d93094087736050e8 100644 --- a/app/aggreagates/Basket.php +++ b/app/aggreagates/Basket.php @@ -22,17 +22,17 @@ final class Basket extends AbstractAggregate implements RecordsEvents * @param \BasketId $basketId * @return \Basket */ - public static function pickUp(BasketId $basketId) + public static function pickUp(BasketId $basketId): self { $basket = new Basket($basketId); $basket->recordThat(new BasketWasPickedUp($basketId)); return $basket; } - public static function reconstituteFrom(AggregateHistory $aggregateHistory) + public static function reconstituteFrom(AggregateHistory $aggregateHistory): self { $basketId = $aggregateHistory->getAggregateId(); - $basket = new static($basketId); + $basket = new static(new BasketId($basketId)); foreach($aggregateHistory as $event) { $basket->apply($event); @@ -106,14 +106,15 @@ final class Basket extends AbstractAggregate implements RecordsEvents } } - private function isProductInBasket(ProductId $productId) { + private function isProductInBasket(ProductId $productId): bool + { return isset($this->itemsCountById[(string) $productId]) && ($this->itemsCountById[(string) $productId] > 0); } // -------- implementation of RecordsEvents ------------------ private $recordedEvents = []; - public function getRecordedEvents() + public function getRecordedEvents(): DomainEvents { return new DomainEvents($this->recordedEvents); } diff --git a/app/events/BasketWasPickedUp.php b/app/events/BasketWasPickedUp.php index 3e6d4f735fce472f061c5de2ad21bbcc117e2bcb..71d8ce3674e21667c6a5b439dbbf2ab1b1b20f7d 100644 --- a/app/events/BasketWasPickedUp.php +++ b/app/events/BasketWasPickedUp.php @@ -1,5 +1,7 @@ <?php +use Ramsey\Uuid\UuidInterface; + class BasketWasPickedUp implements DomainEvent { private $basketId; @@ -13,11 +15,8 @@ class BasketWasPickedUp implements DomainEvent $this->basketId = $basketId; } - /** - * @return \BasketId - */ - public function getAggregateId() + public function getAggregateId(): UuidInterface { - return $this->basketId; + return $this->basketId->getId(); } } \ No newline at end of file diff --git a/app/events/DomainEvent.php b/app/events/DomainEvent.php index 32bd64e27b2501912a65b0bac7b7b5b4b8148091..8843617fff14d01a809eb488065da8feb0478b5c 100644 --- a/app/events/DomainEvent.php +++ b/app/events/DomainEvent.php @@ -1,12 +1,13 @@ <?php +use Ramsey\Uuid\UuidInterface; + interface DomainEvent { /** * Aggregate instance identifier (must be unique per aggregate) - * @return \Ramsey\Uuid\Uuid */ - public function getAggregateId(); + public function getAggregateId(): UuidInterface; } \ No newline at end of file diff --git a/app/events/ProductWasAddedToBasket.php b/app/events/ProductWasAddedToBasket.php index d2a327c6e2bd3669bf597c7b0938cf67a3ad0c0b..ce07c86dd0db8ae0c55132c657ba31f977714e92 100644 --- a/app/events/ProductWasAddedToBasket.php +++ b/app/events/ProductWasAddedToBasket.php @@ -1,5 +1,7 @@ <?php +use Ramsey\Uuid\UuidInterface; + class ProductWasAddedToBasket implements DomainEvent { private $basketId; @@ -19,23 +21,17 @@ class ProductWasAddedToBasket implements DomainEvent $this->productName = $productName; } - public function getAggregateId() + public function getAggregateId(): UuidInterface { - return $this->basketId; + return $this->basketId->getId(); } - /** - * @return BasketId - */ - public function getProductId() + public function getProductId(): ProductId { return $this->productId; } - /** - * @return ProductId - */ - public function getProductName() + public function getProductName(): string { return $this->productName; } diff --git a/app/events/ProductWasRemovedFromBasket.php b/app/events/ProductWasRemovedFromBasket.php index 4c47a3bccd0eeccd0204276f20685cfd2cde3f6c..2a38bda8a0e62a6d39a33c2198a818f5cfe84291 100644 --- a/app/events/ProductWasRemovedFromBasket.php +++ b/app/events/ProductWasRemovedFromBasket.php @@ -1,5 +1,7 @@ <?php +use Ramsey\Uuid\UuidInterface; + class ProductWasRemovedFromBasket implements DomainEvent { private $basketId; @@ -16,18 +18,12 @@ class ProductWasRemovedFromBasket implements DomainEvent $this->productId = $productId; } - /** - * @return BasketId - */ - public function getAggregateId() + public function getAggregateId(): UuidInterface { - return $this->basketId; + return $this->basketId->getId(); } - /** - * @return ProductId - */ - public function getProductId() + public function getProductId(): ProductId { return $this->productId; } diff --git a/app/ids.php b/app/ids.php index fba59010ded5def4143b59a4ada0679173f4fe0d..f622910ce802e967a4df86e305175f31ee424b22 100644 --- a/app/ids.php +++ b/app/ids.php @@ -1,5 +1,7 @@ <?php +use Ramsey\Uuid\UuidInterface; + abstract class AbstractId { private $uuid; @@ -13,11 +15,12 @@ abstract class AbstractId { $this->uuid = $uuid; } - function getId() { + function getId(): UuidInterface + { return $this->uuid; } - function __toString() + function __toString(): string { return (string) $this->uuid; } diff --git a/tests/BasketTest.phpt b/tests/BasketTest.phpt index da11dc3897416ed3db84e319427821587f052244..4c1aea010863059f345e8eb4de3dcb57bb225edc 100644 --- a/tests/BasketTest.phpt +++ b/tests/BasketTest.phpt @@ -74,7 +74,7 @@ class BasketTest extends \Tester\TestCase { // Act $reconstitutedBasket = Basket::reconstituteFrom( - new AggregateHistory($basketId, $retrievedEvents = $events) + new AggregateHistory($basketId->getId(), $retrievedEvents = $events) ); // Assert