/** * @param string[] $result * @param string $entityClass * @param bool $desc */ protected function addEntityIdentifierFieldNames(array &$result, $entityClass, $desc = false) { $idFieldNames = $this->doctrineHelper->getEntityIdentifierFieldNamesForClass($entityClass); foreach ($idFieldNames as $fieldName) { $result[] = $desc ? '-' . $fieldName : $fieldName; } }
/** * @param string $entityClass * @param array $content * * @return array */ protected function getGetRequestConfig($entityClass, $content) { $recordExist = count($content) === 1; $recordContent = $recordExist ? $content[0] : []; $idFields = $this->doctrineHelper->getEntityIdentifierFieldNamesForClass($entityClass); $idFieldCount = count($idFields); if ($idFieldCount === 1) { // single identifier return [$recordExist ? $recordContent[reset($idFields)] : 1, $recordExist]; } elseif ($idFieldCount > 1) { // combined identifier $requirements = []; foreach ($idFields as $field) { $requirements[$field] = $recordExist ? $content[$field] : 1; } return [implode(RestRequest::ARRAY_DELIMITER, $requirements), $recordExist]; } }
/** * {@inheritdoc} */ public function process(ContextInterface $context) { /** @var GetContext $context */ if ($context->hasQuery()) { // a query is already built return; } $entityClass = $context->getClassName(); if (!$this->doctrineHelper->isManageableEntityClass($entityClass)) { // only manageable entities are supported return; } $query = $this->doctrineHelper->getEntityRepositoryForClass($entityClass)->createQueryBuilder('e'); $this->doctrineHelper->applyCriteria($query, $context->getCriteria()); $entityId = $context->getId(); $idFields = $this->doctrineHelper->getEntityIdentifierFieldNamesForClass($entityClass); if (count($idFields) === 1) { // single identifier if (is_array($entityId)) { throw new \UnexpectedValueException(sprintf('The entity identifier cannot be an array because the entity "%s" has single primary key.', $entityClass)); } $query->andWhere(sprintf('e.%s = :id', reset($idFields)))->setParameter('id', $entityId); } else { // combined identifier if (!is_array($entityId)) { throw new \UnexpectedValueException(sprintf('The entity identifier must be an array because the entity "%s" has composite primary key.', $entityClass)); } $counter = 1; foreach ($idFields as $field) { if (!array_key_exists($field, $entityId)) { throw new \UnexpectedValueException(sprintf('The entity identifier array must have the key "%s" because ' . 'the entity "%s" has composite primary key.', $field, $entityClass)); } $query->andWhere(sprintf('e.%s = :id%d', $field, $counter))->setParameter(sprintf('id%d', $counter), $entityId[$field]); $counter++; } } $context->setQuery($query); }
/** * {@inheritdoc} */ public function process(ContextInterface $context) { /** @var RelationConfigContext $context */ $config = $context->getResult(); if (null !== $config && ConfigUtil::isRelationInitialized($config)) { // a config already exists return; } $entityClass = $context->getClassName(); if (!$this->doctrineHelper->isManageableEntityClass($entityClass)) { // only manageable entities are supported return; } if (null === $config) { $config = []; } $targetIdFields = $this->doctrineHelper->getEntityIdentifierFieldNamesForClass($entityClass); if (!isset($config[ConfigUtil::EXCLUSION_POLICY])) { $config[ConfigUtil::EXCLUSION_POLICY] = ConfigUtil::EXCLUSION_POLICY_ALL; } $config[ConfigUtil::FIELDS] = count($targetIdFields) === 1 ? reset($targetIdFields) : array_fill_keys($targetIdFields, null); $context->setResult($config); }
/** * @param array $definition * @param ClassMetadata $metadata * @param string $version * @param string[] $requestType * @param array $extras * * @return array */ protected function getAssociations(array $definition, ClassMetadata $metadata, $version, array $requestType, array $extras) { $associations = $metadata->getAssociationMappings(); foreach ($associations as $fieldName => $mapping) { if (!$this->isAssociationCompletionRequired($fieldName, $definition)) { continue; } $identifierFieldNames = $this->doctrineHelper->getEntityIdentifierFieldNamesForClass($mapping['targetEntity']); $config = [ConfigUtil::DEFINITION => [ConfigUtil::EXCLUSION_POLICY => ConfigUtil::EXCLUSION_POLICY_ALL, ConfigUtil::FIELDS => count($identifierFieldNames) === 1 ? reset($identifierFieldNames) : array_fill_keys($identifierFieldNames, null)]]; if (isset($definition[$fieldName]) && is_array($definition[$fieldName])) { $config = array_merge_recursive($config, [ConfigUtil::DEFINITION => $definition[$fieldName]]); } if ($this->exclusionProvider->isIgnoredRelation($metadata, $fieldName)) { $config[ConfigUtil::DEFINITION][ConfigUtil::EXCLUDE] = true; } $definition[$fieldName] = $config; } return $definition; }