Completed
Push — master ( 7b5328...a0ddef )
by Park Jong-Hun
02:40
created

Dispatcher::getViewModel()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Core\ControllerDispatcher;
4
5
use Prob\Handler\ProcInterface;
6
use Prob\Handler\ParameterMap;
7
use Psr\Http\Message\ServerRequestInterface;
8
use Prob\Router\Dispatcher as RouterDispatcher;
9
use Prob\Router\Matcher;
10
use Prob\Router\Map;
11
use Core\ViewModel;
12
13
class Dispatcher
14
{
15
    /**
16
     * @var Map
17
     */
18
    private $routerMap;
19
    private $routerConfig = [];
20
21
    /**
22
     * @var ViewModel
23
     */
24
    private $viewModel;
25
26
    /**
27
     * @var ServerRequestInterface
28
     */
29
    private $request;
30
31
    public function __construct()
32
    {
33
        $this->viewModel = new ViewModel();
34
    }
35
36
    public function setRouterConfig(array $routerConfig)
37
    {
38
        $this->routerConfig = $routerConfig;
39
    }
40
41
    public function setRequest(ServerRequestInterface $request)
42
    {
43
        $this->request = $request;
44
    }
45
46
    public function getViewModel()
47
    {
48
        return $this->viewModel;
49
    }
50
51
    public function dispatch()
52
    {
53
        $this->buildRouterMap();
54
        $parameterMap = $this->getParameterMap();
55
        $dispatcher = new RouterDispatcher($this->routerMap);
56
57
        /**
58
         * TODO 클로저와 일반함수 형태에서도 컨트롤러 이벤트가 작동하도록 수정해야함.
59
         */
60
61
        ControllerEvent::triggerEvent($this->getController()->getName(), 'before', [$parameterMap]);
62
63
        $result = $dispatcher->dispatch($this->request, $parameterMap);
64
65
        ControllerEvent::triggerEvent($this->getController()->getName(), 'after', [$parameterMap]);
66
67
        return $result;
68
    }
69
70
    private function buildRouterMap()
71
    {
72
        $builder = new RouterMapBuilder();
73
        $builder->setRouterConfig($this->routerConfig);
74
75
        $this->routerMap = $builder->build();
76
    }
77
78
    /**
79
     * @return ParameterMap
80
     */
81
    private function getParameterMap()
82
    {
83
        $parameterMapper = new ParameterMapper();
84
85
        $parameterMapper->setRequest($this->request);
86
        $parameterMapper->setViewModel($this->viewModel);
87
        $parameterMapper->setRouterMap($this->routerMap);
88
89
        return $parameterMapper->getParameterMap();
90
    }
91
92
    /**
93
     * @return ProcInterface
94
     */
95
    private function getController()
96
    {
97
        $matcher = new Matcher($this->routerMap);
98
        return $matcher->match($this->request)['handler'];
99
    }
100
}
101