Skip to content

Commit

Permalink
extract trait
Browse files Browse the repository at this point in the history
  • Loading branch information
taylorotwell committed Sep 29, 2017
1 parent 7892af3 commit 28d945e
Show file tree
Hide file tree
Showing 2 changed files with 163 additions and 157 deletions.
161 changes: 161 additions & 0 deletions src/Illuminate/Http/Resources/ConditionallyLoadsAttributes.php
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
);
}
}
159 changes: 2 additions & 157 deletions src/Illuminate/Http/Resources/Json/Resource.php
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
*
Expand Down Expand Up @@ -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.
*
Expand Down

0 comments on commit 28d945e

Please sign in to comment.