Example #1
0
 /**
  * @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();
     }
 }