/** * Gets a Persister service by key. * * @param string $key * @return PersisterInterface * @throws PersisterException If the service was not found. */ public function getPersister($key) { if (empty($key) || false === $this->hasPersister($key)) { throw PersisterException::persisterNotFound($key); } return $this->persisters[$key]; }
/** * Processes raw MongoDB data an converts it into a standardized Record object. * * @param EntityMetadata $metadata * @param array $data * @param Store $store * @return Record */ protected function hydrateRecord(EntityMetadata $metadata, array $data, Store $store) { $identifier = $data[$this->getIdentifierKey()]; unset($data[$this->getIdentifierKey()]); $type = $this->extractType($metadata, $data); unset($data[$this->getPolymorphicKey()]); $metadata = $store->getMetadataForType($type); foreach ($metadata->getRelationships() as $key => $relMeta) { if (!isset($data[$key])) { continue; } if (true === $relMeta->isMany() && !is_array($data[$key])) { throw PersisterException::badRequest(sprintf('Relationship key "%s" is a reference many. Expected record data type of array, "%s" found on model "%s" for identifier "%s"', $key, gettype($data[$key]), $type, $identifier)); } $references = $relMeta->isOne() ? [$data[$key]] : $data[$key]; $extracted = []; foreach ($references as $reference) { $extracted[] = $this->extractRelationship($relMeta, $reference); } $data[$key] = $relMeta->isOne() ? reset($extracted) : $extracted; } return new Record($type, $identifier, $data); }