/** * @param array $definition * @param string $entityClass * * @return bool */ protected function updateRelations(array &$definition, $entityClass) { $hasChanges = false; $metadata = $this->doctrineHelper->getEntityMetadataForClass($entityClass); foreach ($definition[ConfigUtil::FIELDS] as $fieldName => &$fieldConfig) { if (!is_array($fieldConfig) || empty($fieldConfig[ConfigUtil::DEFINITION][ConfigUtil::FIELDS])) { continue; } $fieldDefinition = $fieldConfig[ConfigUtil::DEFINITION]; if (ConfigUtil::isExclude($fieldDefinition)) { continue; } $propertyPath = ConfigUtil::getPropertyPath($fieldDefinition, $fieldName); if (!$metadata->hasAssociation($propertyPath)) { continue; } $mapping = $metadata->getAssociationMapping($propertyPath); $targetMetadata = $this->doctrineHelper->getEntityMetadataForClass($mapping['targetEntity']); if ($this->isResourceForRelatedEntityAccessible($targetMetadata)) { continue; } $fieldDefinition[ConfigUtil::EXCLUDE] = true; $fieldConfig[ConfigUtil::DEFINITION] = $fieldDefinition; $hasChanges = true; } return $hasChanges; }
/** * @param array|null $config * * @return array */ protected function getAllowedFields($config) { $fields = []; if (!empty($config[ConfigUtil::FIELDS])) { if (is_array($config[ConfigUtil::FIELDS])) { foreach ($config[ConfigUtil::FIELDS] as $fieldName => $fieldConfig) { if (!is_array($fieldConfig) || !ConfigUtil::isExclude($fieldConfig)) { $propertyPath = ConfigUtil::getPropertyPath($fieldConfig, $fieldName); $fields[$propertyPath] = $fieldName; } } } elseif (is_string($config[ConfigUtil::FIELDS])) { $fields[$config[ConfigUtil::FIELDS]] = $config[ConfigUtil::FIELDS]; } } return $fields; }
/** * @param EntityMetadata $entityMetadata * @param array $config */ protected function normalizeMetadata(EntityMetadata $entityMetadata, array $config) { $fields = ConfigUtil::getArrayValue($config, ConfigUtil::FIELDS); foreach ($fields as $fieldName => $fieldConfig) { if (null === $fieldConfig) { continue; } if (ConfigUtil::isExclude($fieldConfig)) { $entityMetadata->removeProperty($fieldName); } elseif (isset($fieldConfig[ConfigUtil::PROPERTY_PATH])) { $path = ConfigUtil::explodePropertyPath($fieldConfig[ConfigUtil::PROPERTY_PATH]); if (count($path) === 1) { $entityMetadata->renameProperty(reset($path), $fieldName); } } } if (ConfigUtil::isExcludeAll($config)) { $toRemoveFieldNames = array_diff(array_merge(array_keys($entityMetadata->getFields()), array_keys($entityMetadata->getAssociations())), array_keys($fields)); foreach ($toRemoveFieldNames as $fieldName) { $entityMetadata->removeProperty($fieldName); } } }
/** * @param object $object * @param array $config * @param int $level * * @return array * * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function normalizeObjectByConfig($object, $config, $level) { if (!ConfigUtil::isExcludeAll($config)) { throw new \RuntimeException(sprintf('The "%s" must be "%s".', ConfigUtil::EXCLUSION_POLICY, ConfigUtil::EXCLUSION_POLICY_ALL)); } if (!array_key_exists(ConfigUtil::FIELDS, $config)) { throw new \RuntimeException(sprintf('The "%s" config does not exist.', ConfigUtil::FIELDS)); } $fields = $config[ConfigUtil::FIELDS]; if (!is_array($fields)) { throw new \RuntimeException(sprintf('The "%s" config must be an array.', ConfigUtil::FIELDS)); } $result = []; foreach ($fields as $fieldName => $fieldConfig) { $value = null; if (is_array($fieldConfig)) { if (ConfigUtil::isExclude($fieldConfig)) { continue; } $propertyPath = !empty($fieldConfig[ConfigUtil::PROPERTY_PATH]) ? $fieldConfig[ConfigUtil::PROPERTY_PATH] : $fieldName; if ($this->dataAccessor->tryGetValue($object, $propertyPath, $value) && null !== $value) { $childFields = isset($fieldConfig[ConfigUtil::FIELDS]) ? $fieldConfig[ConfigUtil::FIELDS] : null; if (is_string($childFields)) { if ($value instanceof \Traversable) { $childValue = []; foreach ($value as $val) { $childVal = null; $this->dataAccessor->tryGetValue($val, $childFields, $childVal); $childValue[] = $childVal; } } else { $childValue = null; if (!$this->dataAccessor->tryGetValue($value, $childFields, $childValue)) { continue; } } $value = $childValue; } elseif (is_array($childFields)) { $value = $this->normalizeObjectByConfig($value, $fieldConfig, $level + 1); } } } elseif (!$this->dataAccessor->tryGetValue($object, $fieldName, $value)) { continue; } $result[$fieldName] = $value; } if (isset($config[ConfigUtil::POST_SERIALIZE])) { $result = call_user_func($config[ConfigUtil::POST_SERIALIZE], $result); } return $result; }
/** * Checks whether an entity has the given field and it is not marked with 'exclude' attribute. * * @param array $config The config of an entity * @param string $field The name of the field * * @return bool */ public static function isExcludedField(array $config, $field) { $result = false; if (isset($config[ConfigUtil::FIELDS])) { $fields = $config[ConfigUtil::FIELDS]; if (!array_key_exists($field, $fields)) { $result = true; } else { $fieldConfig = $fields[$field]; if (is_array($fieldConfig)) { if (array_key_exists(ConfigUtil::DEFINITION, $fieldConfig)) { $fieldConfig = $fieldConfig[ConfigUtil::DEFINITION]; } if (is_array($fieldConfig) && ConfigUtil::isExclude($fieldConfig)) { $result = true; } } } } return $result; }