Skip to content

Commit

Permalink
Improved transformation of relationships
Browse files Browse the repository at this point in the history
  • Loading branch information
kocsismate committed Jul 13, 2015
1 parent 55d1b8f commit 60ffaeb
Show file tree
Hide file tree
Showing 11 changed files with 138 additions and 80 deletions.
4 changes: 1 addition & 3 deletions src/JsonApi/Request/Criteria.php
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,7 @@ public function isIncludedField($resourceType, $field)
*/
protected function setIncludedRelationships()
{
foreach ($this->getQueryParam("include", []) as $relationshipPath => $includes) {
$this->includedFields[$relationshipPath] = explode(",", $includes);
}
$this->includedRelationships = array_flip(explode(",", $this->getQueryParam("include", "")));
}

/**
Expand Down
77 changes: 61 additions & 16 deletions src/JsonApi/Schema/AbstractRelationship.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,77 @@ abstract class AbstractRelationship
use LinksTrait;
use MetaTrait;

abstract protected function addResource(array $resourceIdentifier);
/**
* @var mixed
*/
protected $data;

/**
* @var \WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface
*/
protected $resourceTransformer;

/**
* @param mixed $data
* @param \WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface $resourceTransformer
*/
public function __construct($data, ResourceTransformerInterface $resourceTransformer)
{
$this->data = $data;
$this->resourceTransformer = $resourceTransformer;
}

/**
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $includes
* @param string $relationshipPath
* @return array
*/
abstract protected function transformData(Criteria $criteria, Included $includes, $relationshipPath);

/**
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $includes
* @param string $relationshipPath
* @return array
*/
public function transform(Criteria $criteria, Included $includes, $relationshipPath)
{
$relationship = [];

// LINKS
if ($this->links !== null) {
$relationship["links"] = $this->links->transform();
}

// META
if (empty($this->meta) === false) {
$relationship["meta"] = $this->meta;
}

// DATA
if ($this->data !== null) {
$relationship["data"] = $this->transformData($criteria, $includes, $relationshipPath);
}

return $relationship;
}

/**
* @param mixed $resource
* @param \WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface $transformer
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $includes
* @param string $relationshipPath
* @return array
*/
public function includeRelationship(
$resource,
ResourceTransformerInterface $transformer,
Criteria $criteria,
Included $includes,
$relationshipPath
) {
$this->addResource($transformer->transformToResourceIdentifier($resource));
protected function transformResource($resource, Criteria $criteria, Included $includes, $relationshipPath)
{
if ($criteria->isIncludedRelationship($relationshipPath)) {
$includes->addIncludedResource(
$transformer->transformToResource(
$resource,
$criteria,
$includes,
$relationshipPath
)
$this->resourceTransformer->transformToResource($resource, $criteria, $includes, $relationshipPath)
);
}

return $this->resourceTransformer->transformToResourceIdentifier($resource);
}
}
5 changes: 4 additions & 1 deletion src/JsonApi/Schema/LinkObject.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ public function __construct($href, array $meta = [])
public function transform()
{
$link = ["href" => parent::transform()];
$this->addTransformedMetaToArray($link);

if (empty($this->meta) === false) {
$link["meta"] = $this->meta;
}

return $link;
}
Expand Down
15 changes: 1 addition & 14 deletions src/JsonApi/Schema/LinksTrait.php
Original file line number Diff line number Diff line change
@@ -1,14 +1,12 @@
<?php
namespace WoohooLabs\Yin\JsonApi\Schema;

use WoohooLabs\Yin\JsonApi\Request\Criteria;

trait LinksTrait
{
/**
* @var \WoohooLabs\Yin\JsonApi\Schema\Links
*/
private $links;
protected $links;

/**
* @param \WoohooLabs\Yin\JsonApi\Schema\Links $links
Expand All @@ -20,15 +18,4 @@ public function setLinks(Links $links)

return $this;
}

/**
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param array $array
*/
public function addTransformedLinksToArray(array &$array, Criteria $criteria)
{
if ($this->links !== null) {
$array["links"] = $this->links->transform($criteria);
}
}
}
12 changes: 1 addition & 11 deletions src/JsonApi/Schema/MetaTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ trait MetaTrait
/**
* @var array
*/
private $meta;
protected $meta = [];

/**
* @param array $meta
Expand All @@ -18,14 +18,4 @@ public function setMeta(array $meta)

return $this;
}

/**
* @param array $array
*/
public function addTransformedMetaToArray(array &$array)
{
if (empty($this->meta) === false) {
$array["meta"] = $this->meta;
}
}
}
34 changes: 34 additions & 0 deletions src/JsonApi/Schema/OneToManyArrayRelationship.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php
namespace WoohooLabs\Yin\JsonApi\Schema;

use WoohooLabs\Yin\JsonApi\Request\Criteria;
use WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface;

class OneToManyArrayRelationship extends AbstractRelationship
{
/**
* @param array $data
* @param \WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface $resourceTransformer
*/
public function __construct(array $data, ResourceTransformerInterface $resourceTransformer)
{
parent::__construct($data, $resourceTransformer);
}

/**
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $includes
* @param string $relationshipPath
* @return array
*/
protected function transformData(Criteria $criteria, Included $includes, $relationshipPath)
{
$result = [];

foreach ($this->data as $item) {
$result[] = $this->transformResource($item, $criteria, $includes, $relationshipPath);
}

return $result;
}
}
18 changes: 0 additions & 18 deletions src/JsonApi/Schema/OneToManyRelationship.php

This file was deleted.

22 changes: 16 additions & 6 deletions src/JsonApi/Schema/OneToOneRelationship.php
Original file line number Diff line number Diff line change
@@ -1,18 +1,28 @@
<?php
namespace WoohooLabs\Yin\JsonApi\Schema;

class OneToOneAbstractRelationship extends AbstractRelationship
use WoohooLabs\Yin\JsonApi\Request\Criteria;
use WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface;

class OneToOneRelationship extends AbstractRelationship
{
/**
* @var \WoohooLabs\Yin\JsonApi\Schema\ResourceIdentifier
* @param mixed $data
* @param \WoohooLabs\Yin\JsonApi\Transformer\ResourceTransformerInterface $resourceTransformer
*/
private $data;
public function __construct($data, ResourceTransformerInterface $resourceTransformer)
{
parent::__construct($data, $resourceTransformer);
}

/**
* @param array $resource
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $includes
* @param string $relationshipPath
* @return array
*/
public function addResource(array $resource)
protected function transformData(Criteria $criteria, Included $includes, $relationshipPath)
{
$this->data = $resource;
return $this->transformResource($this->data, $criteria, $includes, $relationshipPath);
}
}
19 changes: 13 additions & 6 deletions src/JsonApi/Schema/Relationships.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,16 +39,23 @@ public function setRelationship($rel, \Closure $relationship)
* @param mixed $resource
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $included
* @param string $relationshipPath
* @param string $baseRelationshipPath
* @return array
*/
public function transform($resource, Criteria $criteria, Included $included, $relationshipPath)
{
public function transform(
$resource,
Criteria $criteria,
Included $included,
$baseRelationshipPath
) {
$relationships = [];

foreach ($this->relationships as $rel => $relationship) {
if ($criteria->isIncludedRelationship($relationshipPath . "." . $rel)) {
$relationships[$rel] = $relationship($resource, $criteria, $included);
foreach ($this->relationships as $rel => $relationshipCallback) {
$relationshipPath = ($baseRelationshipPath ? "$baseRelationshipPath." : "") . $rel;
if ($criteria->isIncludedRelationship($relationshipPath)) {
/** @var \WoohooLabs\Yin\JsonApi\Schema\AbstractRelationship $relationship */
$relationship = $relationshipCallback($resource);
$relationships[$rel] = $relationship->transform($criteria, $included, $relationshipPath);
}
}

Expand Down
6 changes: 4 additions & 2 deletions src/JsonApi/Transformer/AbstractErrorDocument.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
namespace WoohooLabs\Yin\JsonApi\Transformer;

use Psr\Http\Message\ResponseInterface;
use WoohooLabs\Yin\JsonApi\Request\Criteria;
use WoohooLabs\Yin\JsonApi\Schema\Error;

abstract class AbstractErrorDocument extends AbstractDocument
Expand All @@ -28,11 +29,12 @@ public function addError(Error $error)
}

/**
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @return array
*/
protected function transformContent()
protected function transformContent(Criteria $criteria)
{
$content = parent::transformContent();
$content = parent::transformContent($criteria);

// ERRORS
if (empty($this->errors) === false) {
Expand Down
6 changes: 3 additions & 3 deletions src/JsonApi/Transformer/AbstractResourceTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -118,19 +118,19 @@ private function transformAttributes(array &$array, $resource, Criteria $criteri
* @param mixed $resource
* @param \WoohooLabs\Yin\JsonApi\Request\Criteria $criteria
* @param \WoohooLabs\Yin\JsonApi\Schema\Included $included
* @param string $relationshipPath
* @param string $baseRelationshipPath
*/
private function transformRelationships(
array &$array,
$resource,
Criteria $criteria,
Included $included,
$relationshipPath
$baseRelationshipPath
) {
$relationships = $this->getRelationships($resource);

if ($relationships !== null) {
$array["relationships"] = $relationships->transform($resource, $criteria, $included, $relationshipPath);
$array["relationships"] = $relationships->transform($resource, $criteria, $included, $baseRelationshipPath);
}
}
}

0 comments on commit 60ffaeb

Please sign in to comment.