Completed
Push — 1.x ( 11c8ea...1f4201 )
by Akihito
07:04 queued 04:55
created

ParameterHandler::getResourceParam()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 9
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 9
ccs 6
cts 6
cp 1
rs 9.6666
c 0
b 0
f 0
cc 2
eloc 6
nc 2
nop 2
crap 2
1
<?php
2
/**
3
 * This file is part of the BEAR.Resource package.
4
 *
5
 * @license http://opensource.org/licenses/MIT MIT
6
 */
7
namespace BEAR\Resource;
8
9
use BEAR\Resource\Annotation\ResourceParam;
10
use Doctrine\Common\Annotations\Reader;
11
use Ray\Di\InjectorInterface;
12
13
/**
14
 * Resource parameter handler
15
 */
16
class ParameterHandler implements ParameterHandlerInterface
17
{
18
    /**
19
     * @var Reader
20
     */
21
    private $reader;
22
23
    /**
24
     * @var InjectorInterface
25
     */
26
    private $injector;
27
28 38
    public function __construct(Reader $reader, InjectorInterface $injector)
29
    {
30 38
        $this->reader = $reader;
31 38
        $this->injector = $injector;
32 38
    }
33
34
    /**
35
     * {@inheritdoc}
36
     *
37
     * @throws \BEAR\Resource\Exception\ParameterException
38
     */
39 2
    public function handle(\ReflectionParameter $parameter, array $query)
40
    {
41 2
        $func = $parameter->getDeclaringFunction();
42 2
        $method = new \ReflectionMethod($parameter->getDeclaringClass()->name, $func->name);
43 2
        $parameter->getDeclaringFunction()->name;
44 2
        $annotations = $this->reader->getMethodAnnotations($method);
45 2
        foreach ($annotations as $annotation) {
46 1
            if ($annotation instanceof ResourceParam && $annotation->param === $parameter->name) {
47 1
                return $this->getResourceParam($annotation, $query);
48
            }
49
        }
50 1
        (new VoidParameterHandler)->handle($parameter, $query);
51
    }
52
53
    /**
54
     * @param ResourceParam $resourceParam
55
     * @param array         $query
56
     *
57
     * @return mixed
58
     */
59 1
    private function getResourceParam(ResourceParam $resourceParam, array $query)
60
    {
61 1
        $uri = $resourceParam->templated === true ? uri_template($resourceParam->uri, $query) : $resourceParam->uri;
62 1
        $resource = $this->injector->getInstance(ResourceInterface::class);
63 1
        $resourceResult = $resource->get->uri($uri)->eager->request();
64 1
        $fragment = parse_url($uri, PHP_URL_FRAGMENT);
65
66 1
        return $resourceResult[$fragment];
67
    }
68
}
69