/** * @param string $field * @param \StdClass $source * @param object $entity * * @return array|Proxy|object * @throws HydrationException * @throws MappingException */ private function hydrateAssociation($field, $entity, $source) { $accessor = new PropertyAccessor(); $targetClassName = $this->metadata->getAssociationTargetClass($field); $mapping = $this->metadata->getAssociationMapping($field); $targetPersister = $this->manager->getUnitOfWork()->getEntityPersister($targetClassName); $targetMetadata = $this->manager->getClassMetadata($mapping['target']); $apiField = $mapping['api_field']; $field = $mapping['field']; if ($this->metadata->isSingleValuedAssociation($field)) { $identifiers = $this->metadata->getIdentifierValues($entity); if ($mapping['isOwningSide']) { try { $value = $accessor->getValue($source, $apiField); } catch (NoSuchPropertyException $exception) { if ($mapping['nullable']) { return null; } throw new HydrationException(sprintf('Api field %s for property %s does not present in response', $apiField, $field)); } if ($targetMetadata->isIdentifierComposite()) { throw new HydrationException('Composite references not supported'); } $targetIdsNames = $targetMetadata->getIdentifierFieldNames(); $targetIdName = array_shift($targetIdsNames); $type = $this->manager->getConfiguration()->getTypeRegistry()->get($targetMetadata->getTypeOfField($targetIdName)); $identifiers = [$targetIdName => $type->fromApiValue($value)]; } return $targetPersister->getToOneEntity($mapping, $entity, $identifiers); } if ($this->metadata->isCollectionValuedAssociation($field)) { return $targetPersister->getOneToManyCollection($mapping, $entity); } throw new MappingException('Invalid metadata association type'); }
public function __construct(EntityManager $manager) { $this->manager = $manager; $this->uow = $manager->getUnitOfWork(); $proxyGenerator = new ProxyGenerator($this->manager->getConfiguration()->getProxyDir(), $this->manager->getConfiguration()->getProxyNamespace()); parent::__construct($proxyGenerator, $this->manager->getMetadataFactory(), $this->manager->getConfiguration()->isAutogenerateProxies()); }
public function loadById(array $identifiers, $entity = null) { $finderClass = $this->metadata->getFinderClass(); /** @var Finder $finder */ $finder = new $finderClass($this->manager); $body = $finder->find($this->client, $this->metadata, $identifiers); if (null === $body) { return null; } $entity = $this->manager->getUnitOfWork()->getOrCreateEntity($this->metadata->getName(), $body, $entity); return $entity; }