示例#1
0
 /**
  * @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());
         }
     }
 }
示例#2
0
 /**
  * @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());
         }
     }
 }
示例#3
0
 /**
  * @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());
         }
     }
 }