Completed
Push — master ( d2e043...09ed12 )
by Changwan
12:25
created

WanduLoader::bindParameter()   B

Complexity

Conditions 6
Paths 32

Size

Total Lines 28
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 22
CRAP Score 6

Importance

Changes 0
Metric Value
cc 6
eloc 21
nc 32
nop 2
dl 0
loc 28
ccs 22
cts 22
cp 1
crap 6
rs 8.439
c 0
b 0
f 0
1
<?php
2
namespace Wandu\Router\ClassLoader;
3
4
use Psr\Http\Message\ServerRequestInterface;
5
use Wandu\DI\ContainerInterface;
6
use Wandu\Http\Contracts\CookieJarInterface;
7
use Wandu\Http\Contracts\ParsedBodyInterface;
8
use Wandu\Http\Contracts\QueryParamsInterface;
9
use Wandu\Http\Contracts\ServerParamsInterface;
10
use Wandu\Http\Contracts\SessionInterface;
11
use Wandu\Http\Parameters\CookieJar;
12
use Wandu\Http\Parameters\ParsedBody;
13
use Wandu\Http\Parameters\QueryParams;
14
use Wandu\Http\Parameters\ServerParams;
15
use Wandu\Http\Parameters\Session;
16
use Wandu\Http\Psr\ServerRequest;
17
use Wandu\Router\Contracts\ClassLoaderInterface;
18
use Wandu\Router\Exception\HandlerNotFoundException;
19
20
class WanduLoader implements ClassLoaderInterface
21
{
22
    /** @var \Wandu\DI\ContainerInterface */
23
    protected $container;
24
25
    /**
26
     * @param \Wandu\DI\ContainerInterface $container
27
     */
28 5
    public function __construct(ContainerInterface $container)
29
    {
30 5
        $this->container = $container;
31 5
    }
32
33
    /**
34
     * {@inheritdoc}
35
     */
36 2
    public function create($className)
37
    {
38 2
        if (!class_exists($className)) {
39 1
            throw new HandlerNotFoundException($className);
40
        }
41 1
        return $this->container->create($className);
42
    }
43
44
    /**
45
     * {@inheritdoc}
46
     */
47 3
    public function call(ServerRequestInterface $request, $object, $methodName)
48
    {
49 3
        if (!method_exists($object, $methodName) && !method_exists($object, '__call')) {
50
            throw new HandlerNotFoundException(get_class($object), $methodName);
51
        }
52
        // instance container
53 3
        $container = $this->container->with(); // clone
54
55 3
        $this->bindParameter($container, $request);
56 3
        $this->bindServerRequest($container, $request);
57
58 3
        return $container->call([$object, $methodName]);
59
    }
60
61
    /**
62
     * @param \Wandu\DI\ContainerInterface $container
63
     * @param \Psr\Http\Message\ServerRequestInterface $request
64
     */
65 3
    private function bindParameter(ContainerInterface $container, ServerRequestInterface $request)
66
    {
67 3
        if ($serverParams = $request->getAttribute('server_params')) {
68 1
            $container->instance(ServerParams::class, $serverParams);
69 1
            $container->alias(ServerParamsInterface::class, ServerParams::class);
70 1
            $container->alias('server_params', ServerParams::class);
71
        }
72 3
        if ($queryParams = $request->getAttribute('query_params')) {
73 1
            $container->instance(QueryParams::class, $queryParams);
74 1
            $container->alias(QueryParamsInterface::class, QueryParams::class);
75 1
            $container->alias('query_params', QueryParams::class);
76
        }
77 3
        if ($parsedBody = $request->getAttribute('parsed_body')) {
78 1
            $container->instance(ParsedBody::class, $parsedBody);
79 1
            $container->alias(ParsedBodyInterface::class, ParsedBody::class);
80 1
            $container->alias('parsed_body', ParsedBody::class);
81
        }
82 3
        if ($cookie = $request->getAttribute('cookie')) {
83 1
            $container->instance(CookieJar::class, $cookie);
84 1
            $container->alias(CookieJarInterface::class, CookieJar::class);
85 1
            $container->alias('cookie', CookieJar::class);
86
        }
87 3
        if ($session = $request->getAttribute('session')) {
88 1
            $container->instance(Session::class, $session);
89 1
            $container->alias(SessionInterface::class, Session::class);
90 1
            $container->alias('session', Session::class);
91
        }
92 3
    }
93
94
    /**
95
     * @param \Wandu\DI\ContainerInterface $container
96
     * @param \Psr\Http\Message\ServerRequestInterface $request
97
     */
98 3
    private function bindServerRequest(ContainerInterface $container, ServerRequestInterface $request)
99
    {
100 3
        $container->instance(ServerRequest::class, $request);
101 3
        $container->alias(ServerRequestInterface::class, ServerRequest::class);
102 3
        $container->alias('request', ServerRequest::class);
103 3
    }
104
}
105