Completed
Push — master ( a0ddef...830497 )
by Park Jong-Hun
03:15
created

DispatcherBootstrap::stripAppUrlPrefix()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 3
eloc 5
nc 3
nop 1
1
<?php
2
3
namespace App\Bootstrap;
4
5
use Core\Bootstrap\BootstrapInterface;
6
use Core\ControllerDispatcher\Dispatcher;
7
use Core\ControllerDispatcher\ViewRenderer;
8
use Core\ControllerDispatcher\RequestMatcher;
9
use Core\ControllerDispatcher\RouterMapBuilder;
10
use Core\ParameterWire;
11
use Core\ViewModel;
12
use Zend\Diactoros\Uri;
13
use Zend\Diactoros\ServerRequestFactory;
14
use Prob\Handler\ParameterMap;
15
use Prob\Handler\Parameter\Typed;
16
17
class DispatcherBootstrap implements BootstrapInterface
18
{
19
    private $env = [];
20
21
    /**
22
     * @var ViewModel
23
     */
24
    private $viewModel;
25
26
    public function __construct()
27
    {
28
        $this->viewModel = new ViewModel();
29
    }
30
31
    public function boot(array $env)
32
    {
33
        $this->env = $env;
34
35
        RequestMatcher::setRequest($this->getServerRequest());
36
        RequestMatcher::setRouterMap($this->getRouterMap());
37
38
        $dispatcher = $this->getDispatcher();
39
        $viewRenderer = $this->getViewRenderer();
40
41
        $viewRenderer->renderView($dispatcher->dispatch());
42
    }
43
44
    private function getDispatcher()
45
    {
46
        $dispatcher = new Dispatcher();
47
48
        $dispatcher->setRequest($this->getServerRequest());
49
        $dispatcher->setRouterMap($this->getRouterMap());
50
        $dispatcher->setParameterMap($this->getParameterMap());
51
52
        return $dispatcher;
53
    }
54
55
    private function getViewRenderer()
56
    {
57
        $viewRenderer = new ViewRenderer();
58
59
        $viewRenderer->setViewEngineConfig($this->env['viewEngine']);
60
        $viewRenderer->setViewResolver($this->env['viewResolver']);
61
        $viewRenderer->setViewModel($this->viewModel);
62
63
        return $viewRenderer;
64
    }
65
66
    private function getParameterMap()
67
    {
68
        $parameterMap = new ParameterMap();
69
        $parameterMap->bindBy(new Typed(ViewModel::class), $this->viewModel);
70
        return ParameterWire::injectParameter($parameterMap);
71
    }
72
73
    private function getServerRequest()
74
    {
75
        $request = ServerRequestFactory::fromGlobals();
76
77
        $stripedUri = new Uri(
78
            $this->stripAppUrlPrefix($request->getUri()->getPath())
79
        );
80
81
        return $request->withUri($stripedUri);
82
    }
83
84
    private function stripAppUrlPrefix($url)
85
    {
86
        $appUrl = $this->env['site']['url'];
87
88
        if (substr($url, 0, strlen($appUrl)) === $appUrl) {
89
            return '/' . substr($url, strlen($appUrl)) ?: '/';
90
        }
91
92
        return $url;
93
    }
94
95
    private function getRouterMap()
96
    {
97
        return (new RouterMapBuilder($this->env['router']))->build();
98
    }
99
}
100