Completed
Push — master ( e83215...d2e043 )
by Changwan
03:21
created

WanduLoader::bindParameter()   B

Complexity

Conditions 6
Paths 32

Size

Total Lines 28
Code Lines 21

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 7
CRAP Score 17.4096

Importance

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