/** * @param EventSourcedEntity $eventSourcedEntity * * @throws VersionMismatchException */ private function enforceVersionMismatchConstraint(EventSourcedEntity $eventSourcedEntity) { /** @var EventSourcedEntity $databaseVersion */ $databaseVersion = $this->load($eventSourcedEntity->identifier()); if ($databaseVersion->version() !== $eventSourcedEntity->version()) { throw new VersionMismatchException('Local entity is at version ' . $eventSourcedEntity->version() . ' and database is at ' . $databaseVersion->version()); } }
/** * @param EventSourcedEntity $eventSourcedEntity * * @throws InvalidEventException */ protected function persist(EventSourcedEntity $eventSourcedEntity, $event) { if (false === array_key_exists($eventSourcedEntity->identifier(), $this->events)) { $this->events[$eventSourcedEntity->identifier()] = []; } $this->events[$eventSourcedEntity->identifier()][] = ['entity_identifier' => $eventSourcedEntity->identifier(), 'serial_number' => count($this->events[$eventSourcedEntity->identifier()]) + 1, 'entity_class' => get_class($eventSourcedEntity), 'recorded_at' => new \DateTime('now', new \DateTimeZone('UTC')), 'event_class' => get_class($event), 'event' => $this->serialize($event)]; array_push($this->stagedEvents, $event); }
/** * @param EventSourcedEntity $eventSourcedEntity [description] * * @throws InvalidEventException */ private function enforceEventIntegrity(EventSourcedEntity $eventSourcedEntity) { foreach ($eventSourcedEntity->stagedEvents() as $event) { $this->verifyEventIsAClass($event); } }
/** * @param string $eventHook * @param EventSourcedEntity $eventSourcedEntity */ public function publishAll($eventHook, EventSourcedEntity $eventSourcedEntity) { foreach ($eventSourcedEntity->stagedEvents() as $event) { $this->publish($eventHook, $eventSourcedEntity, $event); } }
/** * @param EventSourcedEntity $eventSourcedEntity */ protected function persist(EventSourcedEntity $eventSourcedEntity, $event) { $eventCount = $this->countEntityEvents($eventSourcedEntity->identifier()); $this->connection->insert($this->tableName, ['entity_identifier' => $eventSourcedEntity->identifier(), 'serial_number' => ++$eventCount, 'entity_class' => get_class($eventSourcedEntity), 'recorded_at' => new \DateTime('now', new \DateTimeZone('UTC')), 'event_class' => get_class($event), 'event' => $this->serialize($event)], [\PDO::PARAM_STR, \PDO::PARAM_INT, \PDO::PARAM_STR, 'datetime', \PDO::PARAM_STR, \PDO::PARAM_STR]); array_push($this->stagedEvents, $event); }