Primo Committ
This commit is contained in:
64
vendor/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php
vendored
Normal file
64
vendor/laravel/framework/src/Illuminate/Http/Resources/CollectsResources.php
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
use Illuminate\Pagination\AbstractPaginator;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
trait CollectsResources
|
||||
{
|
||||
/**
|
||||
* Map the given collection resource into its individual resources.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @return mixed
|
||||
*/
|
||||
protected function collectResource($resource)
|
||||
{
|
||||
if ($resource instanceof MissingValue) {
|
||||
return $resource;
|
||||
}
|
||||
|
||||
if (is_array($resource)) {
|
||||
$resource = new Collection($resource);
|
||||
}
|
||||
|
||||
$collects = $this->collects();
|
||||
|
||||
$this->collection = $collects && ! $resource->first() instanceof $collects
|
||||
? $resource->mapInto($collects)
|
||||
: $resource->toBase();
|
||||
|
||||
return $resource instanceof AbstractPaginator
|
||||
? $resource->setCollection($this->collection)
|
||||
: $this->collection;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the resource that this resource collects.
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
protected function collects()
|
||||
{
|
||||
if ($this->collects) {
|
||||
return $this->collects;
|
||||
}
|
||||
|
||||
if (Str::endsWith(class_basename($this), 'Collection') &&
|
||||
class_exists($class = Str::replaceLast('Collection', '', get_class($this)))) {
|
||||
return $class;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an iterator for the resource collection.
|
||||
*
|
||||
* @return \ArrayIterator
|
||||
*/
|
||||
public function getIterator()
|
||||
{
|
||||
return $this->collection->getIterator();
|
||||
}
|
||||
}
|
||||
243
vendor/laravel/framework/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php
vendored
Normal file
243
vendor/laravel/framework/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php
vendored
Normal file
@@ -0,0 +1,243 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
trait ConditionallyLoadsAttributes
|
||||
{
|
||||
/**
|
||||
* Filter the given data, removing any optional values.
|
||||
*
|
||||
* @param array $data
|
||||
* @return array
|
||||
*/
|
||||
protected function filter($data)
|
||||
{
|
||||
$index = -1;
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
$index++;
|
||||
|
||||
if (is_array($value)) {
|
||||
$data[$key] = $this->filter($value);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_numeric($key) && $value instanceof MergeValue) {
|
||||
return $this->mergeData(
|
||||
$data, $index, $this->filter($value->data),
|
||||
array_values($value->data) === $value->data
|
||||
);
|
||||
}
|
||||
|
||||
if ($value instanceof self && is_null($value->resource)) {
|
||||
$data[$key] = null;
|
||||
}
|
||||
}
|
||||
|
||||
return $this->removeMissingValues($data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge the given data in at the given index.
|
||||
*
|
||||
* @param array $data
|
||||
* @param int $index
|
||||
* @param array $merge
|
||||
* @param bool $numericKeys
|
||||
* @return array
|
||||
*/
|
||||
protected function mergeData($data, $index, $merge, $numericKeys)
|
||||
{
|
||||
if ($numericKeys) {
|
||||
return $this->removeMissingValues(array_merge(
|
||||
array_merge(array_slice($data, 0, $index, true), $merge),
|
||||
$this->filter(array_values(array_slice($data, $index + 1, null, true)))
|
||||
));
|
||||
}
|
||||
|
||||
return $this->removeMissingValues(array_slice($data, 0, $index, true) +
|
||||
$merge +
|
||||
$this->filter(array_slice($data, $index + 1, null, true)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove the missing values from the filtered data.
|
||||
*
|
||||
* @param array $data
|
||||
* @return array
|
||||
*/
|
||||
protected function removeMissingValues($data)
|
||||
{
|
||||
$numericKeys = true;
|
||||
|
||||
foreach ($data as $key => $value) {
|
||||
if (($value instanceof PotentiallyMissing && $value->isMissing()) ||
|
||||
($value instanceof self &&
|
||||
$value->resource instanceof PotentiallyMissing &&
|
||||
$value->isMissing())) {
|
||||
unset($data[$key]);
|
||||
} else {
|
||||
$numericKeys = $numericKeys && is_numeric($key);
|
||||
}
|
||||
}
|
||||
|
||||
if (property_exists($this, 'preserveKeys') && $this->preserveKeys === true) {
|
||||
return $data;
|
||||
}
|
||||
|
||||
return $numericKeys ? array_values($data) : $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a value based on a given condition.
|
||||
*
|
||||
* @param bool $condition
|
||||
* @param mixed $value
|
||||
* @param mixed $default
|
||||
* @return \Illuminate\Http\Resources\MissingValue|mixed
|
||||
*/
|
||||
protected function when($condition, $value, $default = null)
|
||||
{
|
||||
if ($condition) {
|
||||
return value($value);
|
||||
}
|
||||
|
||||
return func_num_args() === 3 ? value($default) : new MissingValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge a value into the array.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @return \Illuminate\Http\Resources\MergeValue|mixed
|
||||
*/
|
||||
protected function merge($value)
|
||||
{
|
||||
return $this->mergeWhen(true, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge a value based on a given condition.
|
||||
*
|
||||
* @param bool $condition
|
||||
* @param mixed $value
|
||||
* @return \Illuminate\Http\Resources\MergeValue|mixed
|
||||
*/
|
||||
protected function mergeWhen($condition, $value)
|
||||
{
|
||||
return $condition ? new MergeValue(value($value)) : new MissingValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Merge the given attributes.
|
||||
*
|
||||
* @param array $attributes
|
||||
* @return \Illuminate\Http\Resources\MergeValue
|
||||
*/
|
||||
protected function attributes($attributes)
|
||||
{
|
||||
return new MergeValue(
|
||||
Arr::only($this->resource->toArray(), $attributes)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve an accessor when it has been appended.
|
||||
*
|
||||
* @param string $attribute
|
||||
* @param mixed $value
|
||||
* @param mixed $default
|
||||
* @return \Illuminate\Http\Resources\MissingValue|mixed
|
||||
*/
|
||||
protected function whenAppended($attribute, $value = null, $default = null)
|
||||
{
|
||||
if ($this->resource->hasAppended($attribute)) {
|
||||
return func_num_args() >= 2 ? value($value) : $this->resource->$attribute;
|
||||
}
|
||||
|
||||
return func_num_args() === 3 ? value($default) : new MissingValue;
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve a relationship if it has been loaded.
|
||||
*
|
||||
* @param string $relationship
|
||||
* @param mixed $value
|
||||
* @param mixed $default
|
||||
* @return \Illuminate\Http\Resources\MissingValue|mixed
|
||||
*/
|
||||
protected function whenLoaded($relationship, $value = null, $default = null)
|
||||
{
|
||||
if (func_num_args() < 3) {
|
||||
$default = new MissingValue;
|
||||
}
|
||||
|
||||
if (! $this->resource->relationLoaded($relationship)) {
|
||||
return value($default);
|
||||
}
|
||||
|
||||
if (func_num_args() === 1) {
|
||||
return $this->resource->{$relationship};
|
||||
}
|
||||
|
||||
if ($this->resource->{$relationship} === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
return value($value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a callback if the given pivot table has been loaded.
|
||||
*
|
||||
* @param string $table
|
||||
* @param mixed $value
|
||||
* @param mixed $default
|
||||
* @return \Illuminate\Http\Resources\MissingValue|mixed
|
||||
*/
|
||||
protected function whenPivotLoaded($table, $value, $default = null)
|
||||
{
|
||||
return $this->whenPivotLoadedAs('pivot', ...func_get_args());
|
||||
}
|
||||
|
||||
/**
|
||||
* Execute a callback if the given pivot table with a custom accessor has been loaded.
|
||||
*
|
||||
* @param string $accessor
|
||||
* @param string $table
|
||||
* @param mixed $value
|
||||
* @param mixed $default
|
||||
* @return \Illuminate\Http\Resources\MissingValue|mixed
|
||||
*/
|
||||
protected function whenPivotLoadedAs($accessor, $table, $value, $default = null)
|
||||
{
|
||||
if (func_num_args() === 3) {
|
||||
$default = new MissingValue;
|
||||
}
|
||||
|
||||
return $this->when(
|
||||
$this->resource->$accessor &&
|
||||
($this->resource->$accessor instanceof $table ||
|
||||
$this->resource->$accessor->getTable() === $table),
|
||||
...[$value, $default]
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the given value if it is present.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param callable $callback
|
||||
* @param mixed $default
|
||||
* @return mixed
|
||||
*/
|
||||
protected function transform($value, callable $callback, $default = null)
|
||||
{
|
||||
return transform(
|
||||
$value, $callback, func_num_args() === 3 ? $default : new MissingValue
|
||||
);
|
||||
}
|
||||
}
|
||||
150
vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php
vendored
Normal file
150
vendor/laravel/framework/src/Illuminate/Http/Resources/DelegatesToResource.php
vendored
Normal file
@@ -0,0 +1,150 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Support\Traits\ForwardsCalls;
|
||||
|
||||
trait DelegatesToResource
|
||||
{
|
||||
use ForwardsCalls;
|
||||
|
||||
/**
|
||||
* Get the value of the resource's route key.
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function getRouteKey()
|
||||
{
|
||||
return $this->resource->getRouteKey();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the route key for the resource.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getRouteKeyName()
|
||||
{
|
||||
return $this->resource->getRouteKeyName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the model for a bound value.
|
||||
*
|
||||
* @param mixed $value
|
||||
* @param string|null $field
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function resolveRouteBinding($value, $field = null)
|
||||
{
|
||||
throw new Exception('Resources may not be implicitly resolved from route bindings.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Retrieve the model for a bound value.
|
||||
*
|
||||
* @param string $childType
|
||||
* @param mixed $value
|
||||
* @param string|null $field
|
||||
* @return void
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function resolveChildRouteBinding($childType, $value, $field = null)
|
||||
{
|
||||
throw new Exception('Resources may not be implicitly resolved from route bindings.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the given attribute exists.
|
||||
*
|
||||
* @param mixed $offset
|
||||
* @return bool
|
||||
*/
|
||||
public function offsetExists($offset)
|
||||
{
|
||||
return isset($this->resource[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the value for a given offset.
|
||||
*
|
||||
* @param mixed $offset
|
||||
* @return mixed
|
||||
*/
|
||||
public function offsetGet($offset)
|
||||
{
|
||||
return $this->resource[$offset];
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the value for a given offset.
|
||||
*
|
||||
* @param mixed $offset
|
||||
* @param mixed $value
|
||||
* @return void
|
||||
*/
|
||||
public function offsetSet($offset, $value)
|
||||
{
|
||||
$this->resource[$offset] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset the value for a given offset.
|
||||
*
|
||||
* @param mixed $offset
|
||||
* @return void
|
||||
*/
|
||||
public function offsetUnset($offset)
|
||||
{
|
||||
unset($this->resource[$offset]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if an attribute exists on the resource.
|
||||
*
|
||||
* @param string $key
|
||||
* @return bool
|
||||
*/
|
||||
public function __isset($key)
|
||||
{
|
||||
return isset($this->resource->{$key});
|
||||
}
|
||||
|
||||
/**
|
||||
* Unset an attribute on the resource.
|
||||
*
|
||||
* @param string $key
|
||||
* @return void
|
||||
*/
|
||||
public function __unset($key)
|
||||
{
|
||||
unset($this->resource->{$key});
|
||||
}
|
||||
|
||||
/**
|
||||
* Dynamically get properties from the underlying resource.
|
||||
*
|
||||
* @param string $key
|
||||
* @return mixed
|
||||
*/
|
||||
public function __get($key)
|
||||
{
|
||||
return $this->resource->{$key};
|
||||
}
|
||||
|
||||
/**
|
||||
* Dynamically pass method calls to the underlying resource.
|
||||
*
|
||||
* @param string $method
|
||||
* @param array $parameters
|
||||
* @return mixed
|
||||
*/
|
||||
public function __call($method, $parameters)
|
||||
{
|
||||
return $this->forwardCallTo($this->resource, $method, $parameters);
|
||||
}
|
||||
}
|
||||
27
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/AnonymousResourceCollection.php
vendored
Normal file
27
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/AnonymousResourceCollection.php
vendored
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources\Json;
|
||||
|
||||
class AnonymousResourceCollection extends ResourceCollection
|
||||
{
|
||||
/**
|
||||
* The name of the resource being collected.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $collects;
|
||||
|
||||
/**
|
||||
* Create a new anonymous resource collection.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @param string $collects
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($resource, $collects)
|
||||
{
|
||||
$this->collects = $collects;
|
||||
|
||||
parent::__construct($resource);
|
||||
}
|
||||
}
|
||||
233
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php
vendored
Normal file
233
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php
vendored
Normal file
@@ -0,0 +1,233 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources\Json;
|
||||
|
||||
use ArrayAccess;
|
||||
use Illuminate\Container\Container;
|
||||
use Illuminate\Contracts\Routing\UrlRoutable;
|
||||
use Illuminate\Contracts\Support\Arrayable;
|
||||
use Illuminate\Contracts\Support\Responsable;
|
||||
use Illuminate\Database\Eloquent\JsonEncodingException;
|
||||
use Illuminate\Http\Resources\ConditionallyLoadsAttributes;
|
||||
use Illuminate\Http\Resources\DelegatesToResource;
|
||||
use JsonSerializable;
|
||||
|
||||
class JsonResource implements ArrayAccess, JsonSerializable, Responsable, UrlRoutable
|
||||
{
|
||||
use ConditionallyLoadsAttributes, DelegatesToResource;
|
||||
|
||||
/**
|
||||
* The resource instance.
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
public $resource;
|
||||
|
||||
/**
|
||||
* The additional data that should be added to the top-level resource array.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $with = [];
|
||||
|
||||
/**
|
||||
* The additional meta data that should be added to the resource response.
|
||||
*
|
||||
* Added during response construction by the developer.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $additional = [];
|
||||
|
||||
/**
|
||||
* The "data" wrapper that should be applied.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public static $wrap = 'data';
|
||||
|
||||
/**
|
||||
* Create a new resource instance.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($resource)
|
||||
{
|
||||
$this->resource = $resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new resource instance.
|
||||
*
|
||||
* @param mixed ...$parameters
|
||||
* @return static
|
||||
*/
|
||||
public static function make(...$parameters)
|
||||
{
|
||||
return new static(...$parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create new anonymous resource collection.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
||||
*/
|
||||
public static function collection($resource)
|
||||
{
|
||||
return tap(new AnonymousResourceCollection($resource, static::class), function ($collection) {
|
||||
if (property_exists(static::class, 'preserveKeys')) {
|
||||
$collection->preserveKeys = (new static([]))->preserveKeys === true;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve the resource to an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request|null $request
|
||||
* @return array
|
||||
*/
|
||||
public function resolve($request = null)
|
||||
{
|
||||
$data = $this->toArray(
|
||||
$request = $request ?: Container::getInstance()->make('request')
|
||||
);
|
||||
|
||||
if ($data instanceof Arrayable) {
|
||||
$data = $data->toArray();
|
||||
} elseif ($data instanceof JsonSerializable) {
|
||||
$data = $data->jsonSerialize();
|
||||
}
|
||||
|
||||
return $this->filter((array) $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
if (is_null($this->resource)) {
|
||||
return [];
|
||||
}
|
||||
|
||||
return is_array($this->resource)
|
||||
? $this->resource
|
||||
: $this->resource->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the model instance to JSON.
|
||||
*
|
||||
* @param int $options
|
||||
* @return string
|
||||
*
|
||||
* @throws \Illuminate\Database\Eloquent\JsonEncodingException
|
||||
*/
|
||||
public function toJson($options = 0)
|
||||
{
|
||||
$json = json_encode($this->jsonSerialize(), $options);
|
||||
|
||||
if (JSON_ERROR_NONE !== json_last_error()) {
|
||||
throw JsonEncodingException::forResource($this, json_last_error_msg());
|
||||
}
|
||||
|
||||
return $json;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get any additional data that should be returned with the resource array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function with($request)
|
||||
{
|
||||
return $this->with;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add additional meta data to the resource response.
|
||||
*
|
||||
* @param array $data
|
||||
* @return $this
|
||||
*/
|
||||
public function additional(array $data)
|
||||
{
|
||||
$this->additional = $data;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Customize the response for a request.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Illuminate\Http\JsonResponse $response
|
||||
* @return void
|
||||
*/
|
||||
public function withResponse($request, $response)
|
||||
{
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the string that should wrap the outer-most resource array.
|
||||
*
|
||||
* @param string $value
|
||||
* @return void
|
||||
*/
|
||||
public static function wrap($value)
|
||||
{
|
||||
static::$wrap = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable wrapping of the outer-most resource array.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public static function withoutWrapping()
|
||||
{
|
||||
static::$wrap = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the resource into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request|null $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function response($request = null)
|
||||
{
|
||||
return $this->toResponse(
|
||||
$request ?: Container::getInstance()->make('request')
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTP response that represents the object.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function toResponse($request)
|
||||
{
|
||||
return (new ResourceResponse($this))->toResponse($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the resource for JSON serialization.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return $this->resolve(Container::getInstance()->make('request'));
|
||||
}
|
||||
}
|
||||
84
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php
vendored
Normal file
84
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/PaginatedResourceResponse.php
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources\Json;
|
||||
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class PaginatedResourceResponse extends ResourceResponse
|
||||
{
|
||||
/**
|
||||
* Create an HTTP response that represents the object.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function toResponse($request)
|
||||
{
|
||||
return tap(response()->json(
|
||||
$this->wrap(
|
||||
$this->resource->resolve($request),
|
||||
array_merge_recursive(
|
||||
$this->paginationInformation($request),
|
||||
$this->resource->with($request),
|
||||
$this->resource->additional
|
||||
)
|
||||
),
|
||||
$this->calculateStatus()
|
||||
), function ($response) use ($request) {
|
||||
$response->original = $this->resource->resource->map(function ($item) {
|
||||
return is_array($item) ? Arr::get($item, 'resource') : $item->resource;
|
||||
});
|
||||
|
||||
$this->resource->withResponse($request, $response);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Add the pagination information to the response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
protected function paginationInformation($request)
|
||||
{
|
||||
$paginated = $this->resource->resource->toArray();
|
||||
|
||||
return [
|
||||
'links' => $this->paginationLinks($paginated),
|
||||
'meta' => $this->meta($paginated),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the pagination links for the response.
|
||||
*
|
||||
* @param array $paginated
|
||||
* @return array
|
||||
*/
|
||||
protected function paginationLinks($paginated)
|
||||
{
|
||||
return [
|
||||
'first' => $paginated['first_page_url'] ?? null,
|
||||
'last' => $paginated['last_page_url'] ?? null,
|
||||
'prev' => $paginated['prev_page_url'] ?? null,
|
||||
'next' => $paginated['next_page_url'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Gather the meta data for the response.
|
||||
*
|
||||
* @param array $paginated
|
||||
* @return array
|
||||
*/
|
||||
protected function meta($paginated)
|
||||
{
|
||||
return Arr::except($paginated, [
|
||||
'data',
|
||||
'first_page_url',
|
||||
'last_page_url',
|
||||
'prev_page_url',
|
||||
'next_page_url',
|
||||
]);
|
||||
}
|
||||
}
|
||||
134
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceCollection.php
vendored
Normal file
134
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceCollection.php
vendored
Normal file
@@ -0,0 +1,134 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources\Json;
|
||||
|
||||
use Countable;
|
||||
use Illuminate\Http\Resources\CollectsResources;
|
||||
use Illuminate\Pagination\AbstractPaginator;
|
||||
use IteratorAggregate;
|
||||
|
||||
class ResourceCollection extends JsonResource implements Countable, IteratorAggregate
|
||||
{
|
||||
use CollectsResources;
|
||||
|
||||
/**
|
||||
* The resource that this resource collects.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $collects;
|
||||
|
||||
/**
|
||||
* The mapped collection instance.
|
||||
*
|
||||
* @var \Illuminate\Support\Collection
|
||||
*/
|
||||
public $collection;
|
||||
|
||||
/**
|
||||
* Indicates if all existing request query parameters should be added to pagination links.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $preserveAllQueryParameters = false;
|
||||
|
||||
/**
|
||||
* The query parameters that should be added to the pagination links.
|
||||
*
|
||||
* @var array|null
|
||||
*/
|
||||
protected $queryParameters;
|
||||
|
||||
/**
|
||||
* Create a new resource instance.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($resource)
|
||||
{
|
||||
parent::__construct($resource);
|
||||
|
||||
$this->resource = $this->collectResource($resource);
|
||||
}
|
||||
|
||||
/**
|
||||
* Indicate that all current query parameters should be appended to pagination links.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function preserveQuery()
|
||||
{
|
||||
$this->preserveAllQueryParameters = true;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Specify the query string parameters that should be present on pagination links.
|
||||
*
|
||||
* @param array $query
|
||||
* @return $this
|
||||
*/
|
||||
public function withQuery(array $query)
|
||||
{
|
||||
$this->preserveAllQueryParameters = false;
|
||||
|
||||
$this->queryParameters = $query;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the count of items in the resource collection.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function count()
|
||||
{
|
||||
return $this->collection->count();
|
||||
}
|
||||
|
||||
/**
|
||||
* Transform the resource into a JSON array.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return array
|
||||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
return $this->collection->map->toArray($request)->all();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTP response that represents the object.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function toResponse($request)
|
||||
{
|
||||
if ($this->resource instanceof AbstractPaginator) {
|
||||
return $this->preparePaginatedResponse($request);
|
||||
}
|
||||
|
||||
return parent::toResponse($request);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a paginate-aware HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
protected function preparePaginatedResponse($request)
|
||||
{
|
||||
if ($this->preserveAllQueryParameters) {
|
||||
$this->resource->appends($request->query());
|
||||
} elseif (! is_null($this->queryParameters)) {
|
||||
$this->resource->appends($this->queryParameters);
|
||||
}
|
||||
|
||||
return (new PaginatedResourceResponse($this))->toResponse($request);
|
||||
}
|
||||
}
|
||||
120
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php
vendored
Normal file
120
vendor/laravel/framework/src/Illuminate/Http/Resources/Json/ResourceResponse.php
vendored
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources\Json;
|
||||
|
||||
use Illuminate\Contracts\Support\Responsable;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class ResourceResponse implements Responsable
|
||||
{
|
||||
/**
|
||||
* The underlying resource.
|
||||
*
|
||||
* @var mixed
|
||||
*/
|
||||
public $resource;
|
||||
|
||||
/**
|
||||
* Create a new resource response.
|
||||
*
|
||||
* @param mixed $resource
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($resource)
|
||||
{
|
||||
$this->resource = $resource;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an HTTP response that represents the object.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function toResponse($request)
|
||||
{
|
||||
return tap(response()->json(
|
||||
$this->wrap(
|
||||
$this->resource->resolve($request),
|
||||
$this->resource->with($request),
|
||||
$this->resource->additional
|
||||
),
|
||||
$this->calculateStatus()
|
||||
), function ($response) use ($request) {
|
||||
$response->original = $this->resource->resource;
|
||||
|
||||
$this->resource->withResponse($request, $response);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the given data if necessary.
|
||||
*
|
||||
* @param array $data
|
||||
* @param array $with
|
||||
* @param array $additional
|
||||
* @return array
|
||||
*/
|
||||
protected function wrap($data, $with = [], $additional = [])
|
||||
{
|
||||
if ($data instanceof Collection) {
|
||||
$data = $data->all();
|
||||
}
|
||||
|
||||
if ($this->haveDefaultWrapperAndDataIsUnwrapped($data)) {
|
||||
$data = [$this->wrapper() => $data];
|
||||
} elseif ($this->haveAdditionalInformationAndDataIsUnwrapped($data, $with, $additional)) {
|
||||
$data = [($this->wrapper() ?? 'data') => $data];
|
||||
}
|
||||
|
||||
return array_merge_recursive($data, $with, $additional);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if we have a default wrapper and the given data is unwrapped.
|
||||
*
|
||||
* @param array $data
|
||||
* @return bool
|
||||
*/
|
||||
protected function haveDefaultWrapperAndDataIsUnwrapped($data)
|
||||
{
|
||||
return $this->wrapper() && ! array_key_exists($this->wrapper(), $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if "with" data has been added and our data is unwrapped.
|
||||
*
|
||||
* @param array $data
|
||||
* @param array $with
|
||||
* @param array $additional
|
||||
* @return bool
|
||||
*/
|
||||
protected function haveAdditionalInformationAndDataIsUnwrapped($data, $with, $additional)
|
||||
{
|
||||
return (! empty($with) || ! empty($additional)) &&
|
||||
(! $this->wrapper() ||
|
||||
! array_key_exists($this->wrapper(), $data));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the default data wrapper for the resource.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
protected function wrapper()
|
||||
{
|
||||
return get_class($this->resource)::$wrap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the appropriate status code for the response.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
protected function calculateStatus()
|
||||
{
|
||||
return $this->resource->resource instanceof Model &&
|
||||
$this->resource->resource->wasRecentlyCreated ? 201 : 200;
|
||||
}
|
||||
}
|
||||
33
vendor/laravel/framework/src/Illuminate/Http/Resources/MergeValue.php
vendored
Normal file
33
vendor/laravel/framework/src/Illuminate/Http/Resources/MergeValue.php
vendored
Normal file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
use Illuminate\Support\Collection;
|
||||
use JsonSerializable;
|
||||
|
||||
class MergeValue
|
||||
{
|
||||
/**
|
||||
* The data to be merged.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
public $data;
|
||||
|
||||
/**
|
||||
* Create new merge value instance.
|
||||
*
|
||||
* @param \Illuminate\Support\Collection|\JsonSerializable|array $data
|
||||
* @return void
|
||||
*/
|
||||
public function __construct($data)
|
||||
{
|
||||
if ($data instanceof Collection) {
|
||||
$this->data = $data->all();
|
||||
} elseif ($data instanceof JsonSerializable) {
|
||||
$this->data = $data->jsonSerialize();
|
||||
} else {
|
||||
$this->data = $data;
|
||||
}
|
||||
}
|
||||
}
|
||||
16
vendor/laravel/framework/src/Illuminate/Http/Resources/MissingValue.php
vendored
Normal file
16
vendor/laravel/framework/src/Illuminate/Http/Resources/MissingValue.php
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
class MissingValue implements PotentiallyMissing
|
||||
{
|
||||
/**
|
||||
* Determine if the object should be considered "missing".
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isMissing()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
13
vendor/laravel/framework/src/Illuminate/Http/Resources/PotentiallyMissing.php
vendored
Normal file
13
vendor/laravel/framework/src/Illuminate/Http/Resources/PotentiallyMissing.php
vendored
Normal file
@@ -0,0 +1,13 @@
|
||||
<?php
|
||||
|
||||
namespace Illuminate\Http\Resources;
|
||||
|
||||
interface PotentiallyMissing
|
||||
{
|
||||
/**
|
||||
* Determine if the object should be considered "missing".
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function isMissing();
|
||||
}
|
||||
Reference in New Issue
Block a user