proofdb/vendor/illuminate/http/Resources/JsonApi/JsonApiRequest.php
2026-05-01 23:40:14 +08:00

88 lines
2.6 KiB
PHP

<?php
namespace Illuminate\Http\Resources\JsonApi;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
class JsonApiRequest extends Request
{
/**
* Cached sparse fieldset.
*/
protected ?array $cachedSparseFields = null;
/**
* Cached sparse included.
*/
protected ?array $cachedSparseIncluded = null;
/**
* Get the request's included fields.
*/
public function sparseFields(string $key): array
{
if (is_null($this->cachedSparseFields)) {
$this->cachedSparseFields = (new Collection($this->array('fields')))
->transform(fn ($fieldsets) => empty($fieldsets) ? [] : explode(',', $fieldsets))
->all();
}
return $this->cachedSparseFields[$key] ?? [];
}
/**
* Determine if a sparse fieldset was provided for the given resource type.
*/
public function hasSparseFieldset(string $key): bool
{
if (is_null($this->cachedSparseFields)) {
$this->sparseFields($key);
}
return array_key_exists($key, $this->cachedSparseFields);
}
/**
* Get the request's included relationships.
*/
public function sparseIncluded(?string $key = null): ?array
{
if (is_null($this->cachedSparseIncluded)) {
$included = (string) $this->string('include', '');
$this->cachedSparseIncluded = (new Collection(empty($included) ? [] : explode(',', $included)))
->transform(function ($item) {
$with = null;
if (str_contains($item, '.')) {
[$relation, $with] = explode('.', $item, 2);
} else {
$relation = $item;
}
return ['relation' => $relation, 'with' => $with];
})->mapToGroups(fn ($item) => [$item['relation'] => $item['with']])
->toArray();
}
if (is_null($key)) {
return array_keys($this->cachedSparseIncluded);
}
return transform($this->cachedSparseIncluded[$key] ?? null, function ($value) {
return Collection::wrap($value)
->transform(function ($item) {
if (! is_string($item) || $item === '') {
return null;
}
$item = implode('.', Arr::take(explode('.', $item), JsonApiResource::$maxRelationshipDepth - 1));
return ! empty($item) ? $item : null;
})->filter()->all();
}) ?? [];
}
}