Permalink
Browse files

extract trait

  • Loading branch information...
taylorotwell committed Sep 29, 2017
1 parent 7892af3 commit 28d945e557736598c10c492c2918d5697b70570d
@@ -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
);
}
}
@@ -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.
*

0 comments on commit 28d945e

Please sign in to comment.