From 28d945e557736598c10c492c2918d5697b70570d Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Fri, 29 Sep 2017 09:34:36 -0500 Subject: [PATCH] extract trait --- .../ConditionallyLoadsAttributes.php | 161 ++++++++++++++++++ .../Http/Resources/Json/Resource.php | 159 +---------------- 2 files changed, 163 insertions(+), 157 deletions(-) create mode 100644 src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php diff --git a/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php b/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php new file mode 100644 index 000000000000..476e50d30a5a --- /dev/null +++ b/src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php @@ -0,0 +1,161 @@ + $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 + ); + } +} diff --git a/src/Illuminate/Http/Resources/Json/Resource.php b/src/Illuminate/Http/Resources/Json/Resource.php index 5e275031dbe6..671b81e678f4 100644 --- a/src/Illuminate/Http/Resources/Json/Resource.php +++ b/src/Illuminate/Http/Resources/Json/Resource.php @@ -4,19 +4,17 @@ use ArrayAccess; use JsonSerializable; -use Illuminate\Support\Arr; use Illuminate\Support\Collection; use Illuminate\Container\Container; -use Illuminate\Http\Resources\MergeValue; use Illuminate\Contracts\Support\Arrayable; -use Illuminate\Http\Resources\MissingValue; use Illuminate\Contracts\Routing\UrlRoutable; use Illuminate\Contracts\Support\Responsable; use Illuminate\Http\Resources\DelegatesToResource; +use Illuminate\Http\Resources\ConditionallyLoadsAttributes; class Resource implements ArrayAccess, JsonSerializable, Responsable, UrlRoutable { - use DelegatesToResource; + use ConditionallyLoadsAttributes, DelegatesToResource; /** * The resource instance. @@ -104,67 +102,6 @@ public function resolve($request = null) return $this->filter((array) $data); } - /** - * 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)); - } - /** * Transform the resource into an array. * @@ -212,98 +149,6 @@ public function withResponse($request, $response) // } - /** - * 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 - ); - } - /** * Set the string that should wrap the outer-most resource array. *