/**
  * @param ResourceCollectionInterface $resources
  * @param array $include
  * @param LinkedResourcesSerialization $resourcesSerialization
  * @param array &$relationOfRelation
  * @todo Este método merece un refactor.
  */
 private function processLinkedResources(ResourceCollectionInterface $resources, array $include, LinkedResourcesSerialization $resourcesSerialization, $depth = 0)
 {
     if (self::RECURSION_DEPTH_LIMIT <= $depth) {
         throw new InclusionDepthLimitException(self::ERROR_RECURSION_DEPTH);
     }
     foreach ($include as $relationships) {
         $metadata = $resources->getMetadata();
         $relationshipName = $relationships[$depth];
         $linkedResources = [];
         if ($metadata->isToOneRelationship($relationshipName)) {
             $this->processToOneRelationship($resources, $relationshipName, $linkedResources, $resourcesSerialization);
         } elseif ($metadata->isToManyRelationship($relationshipName)) {
             $this->processToManyRelationship($resources, $relationshipName, $linkedResources, $resourcesSerialization);
         } elseif ($metadata->isLinkOnlyRelationship($relationshipName)) {
             $urlTemplate = $resources->getMetadata()->relationships->linkOnly[$relationshipName]->byPrimaryUrl;
             $message = sprintf(self::ERROR_LINK_ONLY_RELATIONSHIP, $relationshipName, $urlTemplate);
             throw new InvalidRelationshipException($message);
         } else {
             $message = sprintf(self::ERROR_UNKOWN_RELATIONSHIP, $relationshipName);
             throw new InvalidRelationshipException($message);
         }
         if (isset($relationships[$depth + 1]) && !empty($linkedResources)) {
             $this->processLinkedResources(ResourceCollection::buildFromArray($linkedResources), [$relationships], $resourcesSerialization, $depth + 1);
         }
     }
 }
예제 #2
0
 /**
  * @param DocumentResource $documentResource
  * @param ResourceCache $resourceCache
  * @param array $include
  * @param array $sparseFields
  * @param DocumentPagination $pagination
  * @param boolean $i18n
  */
 public function __construct(DocumentResource $documentResource, ResourceCache $resourceCache, array $include = [], array $sparseFields = [], DocumentPagination $pagination = NULL, $i18n = FALSE)
 {
     $this->primaryResources = new TypedResourceCollection($resourceCache);
     $this->linkedResources = new TypedResourceCollection($resourceCache);
     $this->include = $include;
     $this->sparseFields = $sparseFields;
     if ($documentResource instanceof ResourceCollectionInterface) {
         $this->wasCollection = TRUE;
         if (!empty($pagination)) {
             $this->pagination = $pagination;
             if ($documentResource instanceof Paginated) {
                 $this->pagination->fill($documentResource);
             }
         }
     } else {
         $documentResource = ResourceCollection::buildFromResource($documentResource);
     }
     foreach ($documentResource as $resource) {
         $this->primaryResources->addResource($resource);
     }
     $this->resources = $documentResource;
     $this->i18n = $i18n;
 }