-
Notifications
You must be signed in to change notification settings - Fork 11.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7892af3
commit 28d945e
Showing
2 changed files
with
163 additions
and
157 deletions.
There are no files selected for viewing
161 changes: 161 additions & 0 deletions
161
src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,161 @@ | ||
<?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 MissingValue || | ||
($value instanceof self && | ||
$value->resource instanceof MissingValue)) { | ||
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 | ||
* @return \Illuminate\Http\Resources\MissingValue|mixed | ||
*/ | ||
protected function whenLoaded($relationship) | ||
{ | ||
if ($this->resource->relationLoaded($relationship)) { | ||
return $this->resource->{$relationship}; | ||
} | ||
|
||
return new MissingValue; | ||
} | ||
|
||
/** | ||
* 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->pivot && ($this->pivot instanceof $table || $this->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 | ||
); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters