$s3BucketName, 'Key' => $s3ObjectKey, ))); return new self($logFileReader, $logFileIterator); } /** * @param LogFileReader $logFileReader * @param \Iterator $logFileIterator */ public function __construct(LogFileReader $logFileReader, \Iterator $logFileIterator) { $this->logFileReader = $logFileReader; $this->logFileIterator = $logFileIterator; $this->records = array(); $this->recordIndex = 0; } /** * Returns the current log record as a Guzzle Collection object. This object behaves like an associative array * except that it returns `null` on non-existent keys instead of causing an error. See the linked resources for the * schema of the log record data and how to work with Guzzle Collections. * * @return Collection * @link http://docs.aws.amazon.com/awscloudtrail/latest/userguide/eventreference.html * @link http://api.guzzlephp.org/class-Guzzle.Common.Collection.html */ public function current() { if ($this->valid()) { return new Collection($this->records[$this->recordIndex]); } else { return false; } } public function next() { $this->recordIndex++; // If all the records have been exhausted, get more records from the next log file while (!$this->valid()) { $this->logFileIterator->next(); $success = $this->loadRecordsFromCurrentLogFile(); if (!$success) { // The objects iterator is exhausted as well, so stop trying break; } } } public function key() { if ($logFile = $this->logFileIterator->current()) { return $logFile['Key'] . '.' . $this->recordIndex; } else { return null; } } public function valid() { return isset($this->records[$this->recordIndex]); } public function rewind() { $this->logFileIterator->rewind(); $this->loadRecordsFromCurrentLogFile(); } public function getInnerIterator() { return $this->logFileIterator; } /** * Examines the current file in the `logFileIterator` and attempts to read it and load log records from it using * the `logFileReader`. This method expects that items pulled from the iterator will take the form: * * array( * 'Bucket' => '...', * 'Key' => '...', * ) * * @return bool Returns `true` if records were loaded and `false` if no records were found */ private function loadRecordsFromCurrentLogFile() { $this->recordIndex = 0; $this->records = array(); $logFile = $this->logFileIterator->current(); if ($logFile && isset($logFile['Bucket']) && isset($logFile['Key'])) { $this->records = $this->logFileReader->read($logFile['Bucket'], $logFile['Key']); } return (bool) $logFile; } }