/** * @param int $streamVersion * @param Event[] $events */ public function __construct($streamVersion, array $events) { Assert::argumentAtLeast($streamVersion, 1, 'Stream version must be 1 at least'); Assert::argumentLengthAtLeast($events, 1, 'Events list must NOT be empty'); $this->streamVersion = $streamVersion; array_walk($events, function (Event $event) { $this->events[] = $event; }); }
/** * @param EventStreamId $eventStreamId * @param Event[] $events * @throws * @return void */ public function append(EventStreamId $eventStreamId, array $events) { Assert::argumentLengthAtLeast($events, 1, 'At least one event is required'); try { $this->connection->beginTransaction(); $statement = $this->connection->prepare(sprintf('INSERT INTO `%s` (stream_name, stream_version, event_type, event_body) ' . 'VALUES (:stream_name, :stream_version, :event_type, :event_body)', $this->tableName)); $streamIndex = 0; foreach ($events as $event) { $this->appendEvent($statement, $eventStreamId->streamName(), $eventStreamId->streamVersion() + $streamIndex, $event); $streamIndex += 1; } $this->connection->commit(); } catch (Exception $because) { $this->connection->rollBack(); throw EventSourcingException::failedToAppend($because); } if ($this->notifiable) { $this->notifiable->notifyEvents(); } }