/** * @param ResourceTransformer $transformer * @param ResourceCollection $collection * @param ResourceDefinition $definition * @param Context $context * @param RelationshipValue $parent * @param null $parentEntity */ public function processCollection(ResourceTransformer $transformer, ResourceCollection $collection, ResourceDefinition $definition, Context $context, RelationshipValue $parent = null, $parentEntity = null) { $builder = $this->getPaginationBuilderFromDefinition($transformer, $definition, null, null); if (count($collection) > 0 && (!isset($parent) || $parent->getField()->getRecords() > 0)) { // Register all identifiers if parent is present if ($parent) { foreach ($definition->getFields()->getIdentifiers() as $field) { $builder->registerPropertyName($field->getName(), $field->getDisplayName()); } } /** @var RESTResource $first */ $first = $collection->first(); if ($first) { $builder->setFirst($this->transformResource($builder, $first)); } /** @var RESTResource $first */ $last = $collection->last(); if ($last) { $builder->setLast($this->transformResource($builder, $last)); } $cursor = $builder->getNavigation(); if ($parent) { $url = $parent->getField()->getUrl(); } elseif ($context->getUrl()) { $url = $context->getUrl(); } else { $url = $definition->getUrl(); } $url = $transformer->getPropertyResolver()->resolvePathParameters($transformer, $parentEntity, $url, $context); $collection->addMeta('pagination', ['next' => $cursor->getNext() ? $url . '?' . http_build_query($cursor->getNext()) : null, 'previous' => $cursor->getPrevious() ? $url . '?' . http_build_query($cursor->getPrevious()) : null, 'cursors' => $cursor->toArray()]); } }
/** * @param ResourceTransformer $transformer * @param mixed $entity * @param RelationshipValue $value * @param Context $context * @return RESTResource * @throws InvalidPropertyException */ public function resolveOneRelationship(ResourceTransformer $transformer, $entity, RelationshipValue $value, Context $context) { $field = $value->getField(); $child = null; try { $child = $this->resolveProperty($transformer, $entity, $field, $context); } catch (InvalidPropertyException $e) { return null; } if ($child) { return $transformer->toResource($field->getChildResource(), $child, $context->getChildContext($field, $field->getExpandContext()), $value, $entity); } }
/** * @param ResourceTransformer $transformer * @param mixed $entity * @param RelationshipValue $value * @param Context $context * @return ResourceCollection * @throws InvalidPropertyException */ public function resolveManyRelationship(ResourceTransformer $transformer, $entity, RelationshipValue $value, Context $context) : ResourceCollection { $field = $value->getField(); $models = $this->resolveProperty($transformer, $entity, $field, $context); if ($models instanceof Relation) { // Clone to avoid setting multiple filters $models = clone $models; if ($field->getRecords()) { $models->take($field->getRecords()); } $models = $models->get(); } return $transformer->toResources($field->getChildResource(), $models, $context->getChildContext($field, $field->getExpandContext()), $value, $entity); }