/** * Get request includes to prepare the eager loading request * * @return array */ protected function withInclude() { $with = []; // Get includes $includes = $this->response->getManager()->getRequestedIncludes(); // Check if the includes is in the available list // For security reason and validation foreach ($includes as $include) { // Add the include in the with value for eager loading, THIS IS VERY IMPORTANT // @see http://laravel.com/docs/eloquent#eager-loading if (in_array($include, $this->transformer->getAvailableIncludes())) { $with[] = $include; } } return $with; }
/** * Determine if a transformer has any available includes. * * @author Morten Rugaard <*****@*****.**> * * @param \Nodes\Api\Transformer\TransformerAbstract|\League\Fractal\TransformerAbstract|callable $transformer * @return bool */ protected function transformerHasIncludes($transformer) { if (!$transformer instanceof NodesTransformerAbstract && !$transformer instanceof FractalTransformerAbstract) { return false; } $defaultIncludes = $transformer->getDefaultIncludes(); $availableIncludes = $transformer->getAvailableIncludes(); return !empty($defaultIncludes) || !empty($availableIncludes); }
/** * Fire the included transformers. * * @internal * * @param \League\Fractal\TransformerAbstract $transformer * @param mixed $data * * @return array */ protected function fireIncludedTransformers($transformer, $data) { $this->availableIncludes = $transformer->getAvailableIncludes(); return $transformer->processIncludedResources($this, $data) ?: []; }
/** * Get includes as their array keys for eager loading. * * @param \League\Fractal\TransformerAbstract $transformer * @param string|array $requestedIncludes * * @return array */ protected function mergeEagerLoads($transformer, $requestedIncludes) { $availableIncludes = array_intersect($transformer->getAvailableIncludes(), (array) $requestedIncludes); $includes = array_merge($availableIncludes, $transformer->getDefaultIncludes()); $eagerLoads = []; foreach ($includes as $key => $value) { $eagerLoads[] = is_string($key) ? $key : $value; } return $eagerLoads; }
/** * Specify relations for eager loading. * * @return array */ protected function getEagerLoad() { $includes = $this->transformer->getAvailableIncludes(); return $includes ?: []; }
/** * Prepare root scope and set some meta information. * * @param Item|Collection $resource * * @return \League\Fractal\Scope */ protected function prepareRootScope($resource) { $resource->setMetaValue('available_includes', $this->transformer->getAvailableIncludes()); $resource->setMetaValue('default_includes', $this->transformer->getDefaultIncludes()); return $this->fractal->createData($resource); }
/** * @param TransformerAbstract $transformer * @param Request $request * * @return array */ private function getEmbedsWithoutOptions(TransformerAbstract $transformer, Request $request) { $embeds = $request->get('embed', null); if (null === $embeds) { $embeds = implode(',', $transformer->getDefaultIncludes()); } $embedAvailable = $request->headers->get(self::EMBED_AVAILABLE, 0); if ($request->headers->has(self::EMBED_AVAILABLE) && !$embedAvailable) { $transformer->setDefaultIncludes([]); } if ($embedAvailable) { if (is_null($embeds)) { $embeds = implode(',', $transformer->getAvailableIncludes()); } else { $arrayEmbed = array_merge(explode(',', $embeds), $transformer->getAvailableIncludes()); $embeds = implode(',', $arrayEmbed); } } return explode(',', $embeds); }
/** * @param TransformerAbstract $transformer * @param $object * @param $embed * @param string $version * * @return bool */ protected function isEmbed(TransformerAbstract $transformer, $object, $embed, $version = 'v2') { if (in_array($embed, $transformer->getAvailableIncludes())) { return call_user_func([$object, 'get' . ucfirst($embed)]); } return null; }