/** * @return Iterator */ private function parseData() { list($isEmpty, $isOriginallyArrayed, $traversableData) = $this->analyzeCurrentData(); /** @var bool $isEmpty */ /** @var bool $isOriginallyArrayed */ if ($isEmpty === true) { (yield $this->createReplyForEmptyData($traversableData)); } else { $curFrame = $this->stack->end(); // if resource(s) is in primary data section (not in included) $isPrimary = $curFrame->getLevel() < 2; foreach ($traversableData as $resource) { $schema = $this->getSchema($resource, $curFrame); $fieldSet = $this->getFieldSet($schema->getResourceType()); $resourceObject = $schema->createResourceObject($resource, $isOriginallyArrayed, $fieldSet); $isCircular = $this->checkCircular($resourceObject); $this->stack->setCurrentResource($resourceObject); (yield $this->createReplyResourceStarted()); // duplicated are allowed in data however they shouldn't be in includes if ($isCircular === true && $isPrimary === false) { continue; } if ($this->shouldParseRelationships() === true) { $relationships = $this->getIncludeRelationships(); $relObjectIterator = $schema->getRelationshipObjectIterator($resource, $isPrimary, $relationships); foreach ($relObjectIterator as $relationship) { /** @var RelationshipObjectInterface $relationship */ $nextFrame = $this->stack->push(); $nextFrame->setRelationship($relationship); try { if ($this->isRelationshipIncludedOrInFieldSet() === true) { foreach ($this->parseData() as $parseResult) { (yield $parseResult); } } } finally { $this->stack->pop(); } } } (yield $this->createReplyResourceCompleted()); } } }
/** * @return Iterator */ private function parseData() { list($isEmpty, $isOriginallyArrayed, $schema, $traversableData) = $this->analyzeCurrentData(); /** @var bool $isEmpty */ /** @var bool $isOriginallyArrayed */ /** @var SchemaProviderInterface $schema */ if ($isEmpty === true) { (yield $this->createReplyForEmptyData($traversableData)); } else { $curFrame = $this->stack->end(); // duplicated are allowed in data however they shouldn't be in includes $isDupAllowed = $curFrame->getLevel() < 2; $fieldSet = $this->getFieldSet($schema->getResourceType()); foreach ($traversableData as $resource) { $resourceObject = $schema->createResourceObject($resource, $isOriginallyArrayed, $fieldSet); $isCircular = $this->checkCircular($resourceObject); $this->stack->setCurrentResource($resourceObject); (yield $this->createReplyResourceStarted()); if ($isCircular === true && $isDupAllowed === false) { continue; } if ($this->shouldParseRelationships($resourceObject, $isCircular) === true) { foreach ($schema->getRelationshipObjectIterator($resource) as $relationship) { /** @var RelationshipObjectInterface $relationship */ $nextFrame = $this->stack->push(); $nextFrame->setRelationship($relationship); try { if ($this->isShouldRelationshipBeInOutput($resourceObject, $relationship) === true) { foreach ($this->parseData() as $parseResult) { (yield $parseResult); } } } finally { $this->stack->pop(); } } } (yield $this->createReplyResourceCompleted()); } } }
/** * @param array|object|null $data * * @return Iterator */ private function parseData($data) { $curFrame = $this->stack->end(); if (empty($data) === true) { (yield $this->createReplyForEmptyData($data)); } else { if (is_array($data) === true) { $isOriginallyArrayed = true; $schema = $this->container->getSchema($data[0]); } else { $isOriginallyArrayed = false; $schema = $this->container->getSchema($data); $data = [$data]; } // duplicated are allowed in data however they shouldn't be in includes $isDupAllowed = $curFrame->getLevel() < 2; $fieldSet = $this->getFieldSet($schema->getResourceType()); foreach ($data as $resource) { $resourceObject = $schema->createResourceObject($resource, $isOriginallyArrayed, $fieldSet); $isCircular = $this->checkCircular($resourceObject); $this->stack->setCurrentResource($resourceObject); (yield $this->createReplyResourceStarted()); if ($isCircular === true && $isDupAllowed === false || $this->shouldParseRelationships($resourceObject, $isCircular) === false) { continue; } foreach ($schema->getRelationshipObjectIterator($resource) as $relationship) { /** @var RelationshipObjectInterface $relationship */ $nextFrame = $this->stack->push(); $nextFrame->setRelationship($relationship); try { foreach ($this->parseData($relationship->getData()) as $parseResult) { (yield $parseResult); } } finally { $this->stack->pop(); } } (yield $this->createReplyResourceCompleted()); } } }