/** * @param \StdClass $source * @param object|null $entity * * @return object Hydrated object * @throws HydrationException */ public function hydarate($source, $entity = null) { if (null === $entity) { $entity = $this->metadata->getReflectionClass()->newInstance(); } $acessor = new PropertyAccessor(); foreach ($this->metadata->getFieldNames() as $fieldName) { $property = $this->metadata->getReflectionProperty($fieldName); $apiField = $this->metadata->getApiFieldName($fieldName); try { $value = $acessor->getValue($source, $apiField); } catch (NoSuchPropertyException $exception) { if (!$this->metadata->getFieldMapping($fieldName)['nullable']) { throw new HydrationException(sprintf('Api field %s for property %s does not present in response', $apiField, $fieldName)); } $property->setValue($entity, null); continue; } $type = $this->manager->getConfiguration()->getTypeRegistry()->get($this->metadata->getTypeOfField($fieldName)); $value = $type->fromApiValue($value); $property->setValue($entity, $value); } foreach ($this->metadata->getAssociationNames() as $fieldName) { $value = $this->hydrateAssociation($fieldName, $entity, $source); $property = $this->metadata->getReflectionProperty($fieldName); $property->setValue($entity, $value); } return $entity; }
/** * Loads a list of entities by a list of field criteria. * * @param array $criteria * @param array|null $orderBy * @param int|null $limit * @param int|null $offset * * @return Collection */ public function loadAll(array $criteria = [], array $orderBy = null, $limit = null, $offset = null) { $client = $this->manager->getConfiguration()->getRegistry()->get($this->metadata->getClientName()); /** @var Searcher $searcher */ $searcherClass = $this->metadata->getSearcherClass(); $searcher = new $searcherClass($this->manager); $apiCriteria = []; foreach ($criteria as $field => $values) { if ($this->metadata->hasAssociation($field)) { $mapping = $this->metadata->getAssociationMapping($field); /** @var EntityMetadata $target */ $target = $this->manager->getClassMetadata($mapping['target']); $converter = function ($value) use($target) { if (!is_object($value)) { return $value; } $ids = $target->getIdentifierValues($value); if ($target->isIdentifierComposite) { return $ids; } return array_shift($ids); }; if (is_array($values)) { $values = array_map($converter, $values); } else { $values = $converter($values); } } $apiCriteria[$this->metadata->getApiFieldName($field)] = $values; } $apiOrder = []; foreach ((array) $orderBy as $field => $direction) { $apiOrder[$this->metadata->getApiFieldName($field)] = $direction; } $objects = $searcher->search($client, $this->metadata, [$apiCriteria, $apiOrder, $limit, $offset]); $entities = []; foreach ($objects as $object) { $entities[] = $this->manager->getUnitOfWork()->getOrCreateEntity($this->metadata->getName(), $object); } return new ArrayCollection($entities); }