public static function pickUp(BasketId $basketId) { $basket = new BasketV4($basketId); $basket->recordThat(new BasketWasPickedUp($basketId)); // We moved the code that was on this line, to the `whenBasketWasPickedUp()` method. return $basket; }
} /** * @param RecordsEvents $aggregate * @return void */ public function add(RecordsEvents $aggregate) { // To store the updates made to an Aggregate, we only need to commit the latest recorded events to the `EventStore`. $events = $aggregate->getRecordedEvents(); $this->eventStore->commit($events); $aggregate->clearRecordedEvents(); } /** * @param IdentifiesAggregate $aggregateId * @return Basket */ public function get(IdentifiesAggregate $aggregateId) { // Fetching a single `Basket` is extremely easy: all we need is to reconstitute it from its history! Compare // that to the complexity of traditional ORMs. $aggregateHistory = $this->eventStore->getAggregateHistoryFor($aggregateId); return Basketv4::reconstituteFrom($aggregateHistory); } } $basketId = BasketId::generate(); $basket = BasketV4::pickUp($basketId); $basket->addProduct(ProductId::fromString('TPB01'), "The Princess Bride"); $baskets = new BasketRepository(new InMemoryEventStore()); $baskets->add($basket); $reconstitutedBasket = $baskets->get($basketId); it('should reconstitute a Basket to its state after persisting it', $basket == $reconstitutedBasket);