/**
  * @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;
 }
예제 #2
0
 /**
  * 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);
 }