暂存
This commit is contained in:
@@ -0,0 +1,125 @@
|
||||
<?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
|
||||
*/
|
||||
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(),
|
||||
[],
|
||||
$this->resource->jsonOptions()
|
||||
), function ($response) use ($request) {
|
||||
$response->original = $this->resource->resource;
|
||||
|
||||
$this->resource->withResponse($request, $response);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrap the given data if necessary.
|
||||
*
|
||||
* @param \Illuminate\Support\Collection|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)
|
||||
{
|
||||
if ($this->resource instanceof JsonResource && $this->resource::$forceWrapping) {
|
||||
return $this->wrapper() !== null;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user