<?php namespace Knuckles\Scribe\Extracting\Shared; use Illuminate\Pagination\LengthAwarePaginator; use League\Fractal\Manager; use League\Fractal\Resource\Collection; use League\Fractal\Resource\Item; class TransformerResponseTools { public static function fetch(string $transformerClass, bool $isCollection, $modelInstantiator, array $pagination = [], ?string $resourceKey = null, ?string $serializer = null) { $fractal = new Manager(); if (!is_null($serializer)) { $fractal->setSerializer(app($serializer)); } $modelInstance = $modelInstantiator(); if ($isCollection) { $models = [$modelInstance, $modelInstantiator()]; $resource = new Collection($models, new $transformerClass()); ['adapter' => $paginatorAdapter, 'perPage' => $perPage] = $pagination; if ($paginatorAdapter) { $total = count($models); // Need to pass only the first page to both adapter and paginator, otherwise they will display ebverything $firstPage = collect($models)->slice(0, $perPage); $resource = new Collection($firstPage, new $transformerClass(), $resourceKey); $paginator = new LengthAwarePaginator($firstPage, $total, $perPage); $resource->setPaginator(new $paginatorAdapter($paginator)); } } else { $resource = (new Item($modelInstance, new $transformerClass(), $resourceKey)); } return response($fractal->createData($resource)->toJson())->getContent(); } }