container = $data; $this->entityName = $entityName; $this->entityFactory = $entityFactory; } public function first() { reset($this->container); return $this->current(); } public function last() { end($this->container); return $this->current(); } public function rewind() { reset($this->container); } public function current() { return $this->offsetGet($this->key()); } public function next() { next($this->container); } public function key() { return key($this->container); } public function valid() { return $this->offsetExists($this->key()); } public function offsetExists($offset) { return isset($this->container[$offset]); } public function offsetGet($offset) { if (!isset($this->container[$offset])) { return null; } return $this->getEntityByOffset($offset); } public function offsetSet($offset, $value) { if (!($value instanceof Entity)) { throw new \InvalidArgumentException('Only Entity is allowed to be added to EntityCollection.'); } if (is_null($offset)) { $this->container[] = $value; } else { $this->container[$offset] = $value; } } public function offsetUnset($offset) { unset($this->container[$offset]); } public function count() { return count($this->container); } public function append(Entity $entity) { $this->container[] = $entity; } private function getEntityByOffset($offset) { $value = $this->container[$offset]; if ($value instanceof Entity) { return $value; } else if (is_array($value)) { $this->container[$offset] = $this->buildEntityFromArray($value); } else { return null; } return $this->container[$offset]; } protected function buildEntityFromArray(array $dataArray) { $entity = $this->entityFactory->create($this->entityName); if ($entity) { $entity->set($dataArray); $entity->setAsFetched(); return $entity; } } public function getEntityName() { return $this->entityName; } public function getInnerContainer() { return $this->container; } public function merge(EntityCollection $collection) { $newData = $this->container; $incomingData = $collection->getInnerContainer(); foreach ($incomingData as $v) { if (!$this->contains($v)) { $this->container[] = $v; } } } public function contains($value) { if ($this->indexOf($value) !== false) { return true; } return false; } public function indexOf($value) { $index = 0; if (is_array($value)) { foreach ($this->container as $v) { if (is_array($v)) { if ($value['id'] == $v['id']) { return $index; } } else if ($v instanceof Entity) { if ($value['id'] == $v->id) { return $index; } } $index ++; } } else if ($value instanceof Entity) { foreach ($this->container as $v) { if (is_array($v)) { if ($value->id == $v['id']) { return $index; } } else if ($v instanceof Entity) { if ($value === $v) { return $index; } } $index ++; } } return false; } public function toArray() { $arr = array(); foreach ($this as $entity) { $arr[] = $entity->toArray(); } return $arr; } }