Passed
Push — master ( 39e4c0...d4ca25 )
by Michael
03:36
created

LinkHandler::resolveParameters()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 16
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 8
CRAP Score 3

Importance

Changes 0
Metric Value
dl 0
loc 16
ccs 8
cts 8
cp 1
rs 9.4285
c 0
b 0
f 0
cc 3
eloc 8
nc 3
nop 2
crap 3
1
<?php
2
declare(strict_types = 1);
3
4
namespace Mikemirten\Component\JsonApi\Mapper\Handler;
5
6
use Mikemirten\Component\JsonApi\Document\LinkObject;
7
use Mikemirten\Component\JsonApi\Document\ResourceObject;
8
use Mikemirten\Component\JsonApi\Mapper\Definition\Link as LinkDefinition;
9
use Mikemirten\Component\JsonApi\Mapper\Handler\LinkRepository\RepositoryProvider as LinkRepositoryProvider;
10
use Mikemirten\Component\JsonApi\Mapper\Handler\PropertyAccessor\PropertyAccessorInterface;
11
use Mikemirten\Component\JsonApi\Mapper\MappingContext;
12
13
class LinkHandler implements HandlerInterface
14
{
15
    /**
16
     * Provider of links' repositories
17
     *
18
     * @var LinkRepositoryProvider
19
     */
20
    protected $provider;
21
22
    /**
23
     * Property accessor
24
     *
25
     * @var PropertyAccessorInterface
26
     */
27
    protected $accessor;
28
29
    /**
30
     * LinkHandler constructor.
31
     *
32
     * @param LinkRepositoryProvider    $provider
33
     * @param PropertyAccessorInterface $accessor
34
     */
35 1
    public function __construct(LinkRepositoryProvider $provider, PropertyAccessorInterface $accessor)
36
    {
37 1
        $this->provider = $provider;
38 1
        $this->accessor = $accessor;
39 1
    }
40
41
    /**
42
     * {@inheritdoc}
43
     */
44 1
    public function toResource($object, ResourceObject $resource, MappingContext $context)
45
    {
46 1
        foreach ($context->getDefinition()->getLinks() as $linkDefinition)
47
        {
48 1
            $repoName = $linkDefinition->getRepositoryName();
49 1
            $linkName = $linkDefinition->getLinkName();
50
51 1
            $parameters = $this->resolveParameters($object, $linkDefinition);
52
53 1
            $linkData = $this->provider
54 1
                ->getRepository($repoName)
55 1
                ->getLink($linkName, $parameters);
56
57 1
            $link = new LinkObject(
58 1
                $linkData->getReference(),
59
                array_replace(
60 1
                    $linkData->getMetadata(),
61 1
                    $linkDefinition->getMetadata()
62
                )
63
            );
64
65 1
            $resource->setLink($linkDefinition->getName(), $link);
66
        }
67 1
    }
68
69
    /**
70
     * Resolve parameters
71
     *
72
     * @param  mixed          $object
73
     * @param  LinkDefinition $definition
74
     * @return array
75
     */
76 1
    protected function resolveParameters($object, LinkDefinition $definition): array
77
    {
78 1
        $resolved = [];
79
80 1
        foreach ($definition->getParameters() as $name => $value)
81
        {
82 1
            if (strpos($value, '@') === 0) {
83 1
                $resolved[$name] = $this->accessor->getValue($object, substr($value, 1));
84 1
                continue;
85
            }
86
87 1
            $resolved[$name] = $value;
88
        }
89
90 1
        return $resolved;
91
    }
92
93
    /**
94
     * {@inheritdoc}
95
     */
96
    public function fromResource($object, ResourceObject $resource, MappingContext $context)
97
    {
98
        // Do nothing
99
    }
100
}