179 lines
4.6 KiB
PHP
179 lines
4.6 KiB
PHP
<?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->merge($data, $index, $this->filter($value->data));
|
|
}
|
|
|
|
if (($value instanceof PotentiallyMissing && $value->isMissing()) ||
|
|
($value instanceof self &&
|
|
$value->resource instanceof PotentiallyMissing &&
|
|
$value->isMissing())) {
|
|
unset($data[$key]);
|
|
|
|
$index--;
|
|
}
|
|
|
|
if ($value instanceof self && is_null($value->resource)) {
|
|
$data[$key] = null;
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Merge the given data in at the given index.
|
|
*
|
|
* @param array $data
|
|
* @param int $index
|
|
* @param array $merge
|
|
* @return array
|
|
*/
|
|
protected function merge($data, $index, $merge)
|
|
{
|
|
if (array_values($data) === $data) {
|
|
return array_merge(
|
|
array_merge(array_slice($data, 0, $index, true), $merge),
|
|
$this->filter(array_slice($data, $index + 1, null, true))
|
|
);
|
|
}
|
|
|
|
return array_slice($data, 0, $index, true) +
|
|
$merge +
|
|
$this->filter(array_slice($data, $index + 1, null, true));
|
|
}
|
|
|
|
/**
|
|
* 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 based on a given condition.
|
|
*
|
|
* @param bool $condition
|
|
* @param mixed $value
|
|
* @return \Illuminate\Http\Resources\MissingValue|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 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 $default;
|
|
}
|
|
|
|
if (func_num_args() === 1) {
|
|
return $this->resource->{$relationship};
|
|
}
|
|
|
|
if ($this->resource->{$relationship} === null) {
|
|
return null;
|
|
}
|
|
|
|
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)
|
|
{
|
|
if (func_num_args() === 2) {
|
|
$default = new MissingValue;
|
|
}
|
|
|
|
return $this->when(
|
|
$this->resource->pivot &&
|
|
($this->resource->pivot instanceof $table ||
|
|
$this->resource->pivot->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
|
|
);
|
|
}
|
|
}
|