/** * @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); } } }
/** * @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; }