primo commit
This commit is contained in:
234
libraries/vendor/tobscure/json-api/src/Document.php
vendored
Normal file
234
libraries/vendor/tobscure/json-api/src/Document.php
vendored
Normal file
@ -0,0 +1,234 @@
|
||||
<?php
|
||||
|
||||
/*
|
||||
* This file is part of JSON-API.
|
||||
*
|
||||
* (c) Toby Zerner <toby.zerner@gmail.com>
|
||||
*
|
||||
* For the full copyright and license information, please view the LICENSE
|
||||
* file that was distributed with this source code.
|
||||
*/
|
||||
|
||||
namespace Tobscure\JsonApi;
|
||||
|
||||
use JsonSerializable;
|
||||
|
||||
class Document implements JsonSerializable
|
||||
{
|
||||
use LinksTrait;
|
||||
use MetaTrait;
|
||||
|
||||
const MEDIA_TYPE = 'application/vnd.api+json';
|
||||
|
||||
/**
|
||||
* The included array.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $included = [];
|
||||
|
||||
/**
|
||||
* The errors array.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $errors;
|
||||
|
||||
/**
|
||||
* The jsonapi array.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $jsonapi;
|
||||
|
||||
/**
|
||||
* The data object.
|
||||
*
|
||||
* @var ElementInterface
|
||||
*/
|
||||
protected $data;
|
||||
|
||||
/**
|
||||
* @param ElementInterface $data
|
||||
*/
|
||||
public function __construct(ElementInterface $data = null)
|
||||
{
|
||||
$this->data = $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get included resources.
|
||||
*
|
||||
* @param \Tobscure\JsonApi\ElementInterface $element
|
||||
* @param bool $includeParent
|
||||
*
|
||||
* @return \Tobscure\JsonApi\Resource[]
|
||||
*/
|
||||
protected function getIncluded(ElementInterface $element, $includeParent = false)
|
||||
{
|
||||
$included = [];
|
||||
|
||||
foreach ($element->getResources() as $resource) {
|
||||
if ($resource->isIdentifier()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ($includeParent) {
|
||||
$included = $this->mergeResource($included, $resource);
|
||||
} else {
|
||||
$type = $resource->getType();
|
||||
$id = $resource->getId();
|
||||
}
|
||||
|
||||
foreach ($resource->getUnfilteredRelationships() as $relationship) {
|
||||
$includedElement = $relationship->getData();
|
||||
|
||||
if (! $includedElement instanceof ElementInterface) {
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach ($this->getIncluded($includedElement, true) as $child) {
|
||||
// If this resource is the same as the top-level "data"
|
||||
// resource, then we don't want it to show up again in the
|
||||
// "included" array.
|
||||
if (! $includeParent && $child->getType() === $type && $child->getId() === $id) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$included = $this->mergeResource($included, $child);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$flattened = [];
|
||||
|
||||
array_walk_recursive($included, function ($a) use (&$flattened) {
|
||||
$flattened[] = $a;
|
||||
});
|
||||
|
||||
return $flattened;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Tobscure\JsonApi\Resource[] $resources
|
||||
* @param \Tobscure\JsonApi\Resource $newResource
|
||||
*
|
||||
* @return \Tobscure\JsonApi\Resource[]
|
||||
*/
|
||||
protected function mergeResource(array $resources, Resource $newResource)
|
||||
{
|
||||
$type = $newResource->getType();
|
||||
$id = $newResource->getId();
|
||||
|
||||
if (isset($resources[$type][$id])) {
|
||||
$resources[$type][$id]->merge($newResource);
|
||||
} else {
|
||||
$resources[$type][$id] = $newResource;
|
||||
}
|
||||
|
||||
return $resources;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the data object.
|
||||
*
|
||||
* @param \Tobscure\JsonApi\ElementInterface $element
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setData(ElementInterface $element)
|
||||
{
|
||||
$this->data = $element;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the errors array.
|
||||
*
|
||||
* @param array $errors
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setErrors($errors)
|
||||
{
|
||||
$this->errors = $errors;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the jsonapi array.
|
||||
*
|
||||
* @param array $jsonapi
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setJsonapi($jsonapi)
|
||||
{
|
||||
$this->jsonapi = $jsonapi;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map everything to arrays.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function toArray()
|
||||
{
|
||||
$document = [];
|
||||
|
||||
if (! empty($this->links)) {
|
||||
$document['links'] = $this->links;
|
||||
}
|
||||
|
||||
if (! empty($this->data)) {
|
||||
$document['data'] = $this->data->toArray();
|
||||
|
||||
$resources = $this->getIncluded($this->data);
|
||||
|
||||
if (count($resources)) {
|
||||
$document['included'] = array_map(function (Resource $resource) {
|
||||
return $resource->toArray();
|
||||
}, $resources);
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($this->meta)) {
|
||||
$document['meta'] = $this->meta;
|
||||
}
|
||||
|
||||
if (! empty($this->errors)) {
|
||||
$document['errors'] = $this->errors;
|
||||
}
|
||||
|
||||
if (! empty($this->jsonapi)) {
|
||||
$document['jsonapi'] = $this->jsonapi;
|
||||
}
|
||||
|
||||
return $document;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map to string.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function __toString()
|
||||
{
|
||||
return json_encode($this->toArray());
|
||||
}
|
||||
|
||||
/**
|
||||
* Serialize for JSON usage.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
#[\ReturnTypeWillChange]
|
||||
public function jsonSerialize()
|
||||
{
|
||||
return $this->toArray();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user