/** * @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 $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]; $propertyPath = ConfigUtil::getPropertyPath($fieldDefinition, $fieldName); if (!$metadata->hasAssociation($propertyPath)) { continue; } $mapping = $metadata->getAssociationMapping($propertyPath); $targetMetadata = $this->doctrineHelper->getEntityMetadataForClass($mapping['targetEntity']); if ($targetMetadata->inheritanceType === ClassMetadata::INHERITANCE_TYPE_NONE) { continue; } if (!is_array($fieldDefinition[ConfigUtil::FIELDS])) { $fieldDefinition[ConfigUtil::FIELDS] = [$fieldDefinition[ConfigUtil::FIELDS] => null]; } $fieldDefinition[ConfigUtil::FIELDS][ConfigUtil::CLASS_NAME] = null; $fieldConfig[ConfigUtil::DEFINITION] = $fieldDefinition; $hasChanges = true; } return $hasChanges; }
/** * @param string $entityClass * @param string $filterKey * @param array $filterConfig * * @return ConfigInterface|null */ protected function findFieldConfig($entityClass, $filterKey, $filterConfig) { $path = ConfigUtil::explodePropertyPath(ConfigUtil::getPropertyPath($filterConfig, $filterKey)); if (count($path) === 1) { return $this->getFieldConfig($entityClass, reset($path)); } $linkedProperty = array_pop($path); $classMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path); return null !== $classMetadata ? $this->getFieldConfig($classMetadata->name, $linkedProperty) : null; }
/** * @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 array $sectionConfig * @param string $sectionName * @param array $definition * @param array $childSectionConfig * @param string $fieldPrefix * @param string $pathPrefix * * @return array */ protected function collectNested(array &$sectionConfig, $sectionName, array $definition, array $childSectionConfig, $fieldPrefix, $pathPrefix) { $this->updatePropertyPath($childSectionConfig, $definition); $fields = ConfigUtil::getArrayValue($childSectionConfig, ConfigUtil::FIELDS); foreach ($fields as $fieldName => $config) { $fieldPath = ConfigUtil::getPropertyPath($config, $fieldName); $field = $fieldPrefix . $fieldName; if (!isset($sectionConfig[ConfigUtil::FIELDS][$field])) { $path = $pathPrefix . $fieldPath; if ($path !== $field) { $config[ConfigUtil::PROPERTY_PATH] = $path; } elseif (is_array($config) && array_key_exists(ConfigUtil::PROPERTY_PATH, $config)) { unset($config[ConfigUtil::PROPERTY_PATH]); } $sectionConfig[ConfigUtil::FIELDS][$field] = $config; } if (is_array($definition) && !empty($definition[ConfigUtil::FIELDS][$fieldName][$sectionName])) { $this->collectNested($sectionConfig, $sectionName, ConfigUtil::getArrayValue($definition[ConfigUtil::FIELDS][$fieldName], ConfigUtil::DEFINITION), $definition[ConfigUtil::FIELDS][$fieldName][$sectionName], $this->buildPrefix($fieldName, $fieldPrefix), $this->buildPrefix($fieldPath, $pathPrefix)); } } }
/** * @param array $definition * @param string $entityClass * @param int $limit */ protected function setLimits(array &$definition, $entityClass, $limit) { if (isset($definition[ConfigUtil::FIELDS]) && is_array($definition[ConfigUtil::FIELDS])) { $metadata = $this->doctrineHelper->getEntityMetadataForClass($entityClass); foreach ($definition[ConfigUtil::FIELDS] as $fieldName => &$fieldConfig) { if (is_array($fieldConfig)) { $propertyPath = ConfigUtil::getPropertyPath($fieldConfig, $fieldName); $path = ConfigUtil::explodePropertyPath($propertyPath); if (count($path) === 1) { $this->setFieldLimit($fieldConfig, $metadata, $propertyPath, $limit); } else { $linkedField = array_pop($path); $linkedMetadata = $this->doctrineHelper->findEntityMetadataByPath($entityClass, $path); if (null !== $linkedMetadata) { $this->setFieldLimit($fieldConfig, $linkedMetadata, $linkedField, $limit); } } } } } }
/** * {@inheritdoc} */ public function process(ContextInterface $context) { /** @var GetListContext $context */ $configOfFilters = $context->getConfigOfFilters(); if (empty($configOfFilters)) { // a filters' configuration does not contains any data return; } if (!ConfigUtil::isExcludeAll($configOfFilters)) { // it seems that filters' configuration was not normalized throw new \RuntimeException(sprintf('Expected "all" exclusion policy for filters. Got: %s.', ConfigUtil::getExclusionPolicy($configOfFilters))); } $fields = ConfigUtil::getArrayValue($configOfFilters, ConfigUtil::FIELDS); $filters = $context->getFilters(); foreach ($fields as $field => $fieldConfig) { if ($filters->has($field)) { continue; } $filter = $this->createFilter(ConfigUtil::getPropertyPath($fieldConfig, $field), $fieldConfig); if (null !== $filter) { $filters->add($field, $filter); } } }
/** * @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 = ConfigUtil::getPropertyPath($fieldConfig, $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; }