private function isTooDeep(Context $context) { $depth = $context->getDepth(); $groups = $context->attributes->get('groups')->get(); $metadataStack = $context->getMetadataStack(); $nthProperty = 0; // iterate from the first added items to the lasts for ($i = $metadataStack->count() - 1; $i > 0; $i--) { $metadata = $metadataStack[$i]; if ($metadata instanceof PropertyMetadata) { $maxDepth = null; if ($metadata->maxDepth) { if (!is_array($metadata->maxDepth)) { $maxDepth = (int) $metadata->maxDepth; } else { foreach ($groups as $group) { if (array_key_exists($group, $metadata->maxDepth) && $metadata->maxDepth[$group] > $maxDepth) { $maxDepth = $metadata->maxDepth[$group]; } } } } $nthProperty++; $relativeDepth = $depth - $nthProperty; if (null !== $maxDepth && $relativeDepth > $maxDepth) { return true; } } } return false; }
/** * @param PropertyMetadata $property * @param Context $context * @return bool */ public function shouldSkipProperty(PropertyMetadata $property, Context $context) { $plainFields = $this->transformToPlainArray($this->scope); if ($property->name == 'id') { return false; } $stack = $this->getStackAsString($context->getMetadataStack()); if ($stack) { $propertyInStack = $stack . '.' . $property->name; return !in_array($propertyInStack, $plainFields); } return !in_array($property->name, $plainFields); }
/** * {@inheritDoc} */ public function shouldSkipProperty(PropertyMetadata $property, Context $navigatorContext) { // name,{main_address:[zip_code,{point:[latitude,longitude]}]} $filteredMetadataStack = $this->filterMetadataStack($navigatorContext->getMetadataStack()); $filteredMetadataStack->push($property); $part = $this->fields; foreach ($filteredMetadataStack as $curKey) { $part = $this->findArrayPart($this->namingStrategy->translateName($curKey), $part); } if ($part != false) { return false; } return true; }
/** * @param \JMS\Serializer\VisitorInterface $visitor * @param \JMS\Serializer\Context $context * @return string */ private function getFieldPath(VisitorInterface $visitor, Context $context) { $path = ''; foreach ($context->getMetadataStack() as $element) { if ($element instanceof PropertyMetadata) { $name = $element->serializedName !== null ? $element->serializedName : $element->name; if ($visitor instanceof AbstractVisitor) { $name = $visitor->getNamingStrategy()->translateName($element); } $path = $name . self::PATH_FIELD_SEPARATOR . $path; } } $path = rtrim($path, self::PATH_FIELD_SEPARATOR); return $path; }
private function isTooDeep(Context $context) { $depth = $context->getDepth(); $metadataStack = $context->getMetadataStack(); $nthProperty = 0; // iterate from the first added items to the lasts for ($i = $metadataStack->count() - 1; $i > 0; $i--) { $metadata = $metadataStack[$i]; if ($metadata instanceof PropertyMetadata) { $nthProperty++; $relativeDepth = $depth - $nthProperty; if (null !== $metadata->maxDepth && $relativeDepth > $metadata->maxDepth) { return true; } } } return false; }
/** * @param Context $context */ private function applyRecursiveGroups(Context $context) { if ($context->getMetadataStack() && $context->attributes->containsKey('groups')) { $groups = array_fill_keys($context->attributes->get('groups')->get(), true); $groupModifiers = array(); $path = ''; foreach ($context->getMetadataStack() as $metadata) { if ($metadata instanceof PropertyMetadata && is_array($metadata->recursionGroups)) { $path = '.' . $metadata->name . $path; $groupModifiers[] = $metadata->recursionGroups; } } foreach (array_reverse($groupModifiers) as $modifier) { foreach ($modifier as $ifGroup => $withGroups) { if (isset($groups[$ifGroup])) { $groups = $withGroups; break; } } } $this->changeContextGroups($context, array_keys($groups)); } }