Completed
Push — master ( 5eae2e...40f0f7 )
by Park Jong-Hun
02:53
created

Dispatcher::getParameterMap()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 10
rs 9.4285
cc 1
eloc 6
nc 1
nop 1
1
<?php
2
3
namespace Core\ControllerDispatcher;
4
5
use Prob\Handler\Proc;
6
use Prob\Handler\ParameterMap;
7
use Prob\Router\Dispatcher as RouterDispatcher;
8
use Prob\Rewrite\Request;
9
use Prob\Router\Matcher;
10
use Prob\Router\Map;
11
use Core\ViewModel;
12
use Core\Application;
13
use Core\ViewResolver;
14
15
class Dispatcher
16
{
17
18
    /**
19
     * @var Map
20
     */
21
    private $routerMap;
22
    private $routerConfig = [];
23
    private $viewEngineConfig = [];
24
25
    /**
26
     * @var Request
27
     */
28
    private $request;
29
30
    public function setRouterConfig(array $routerConfig)
31
    {
32
        $this->routerConfig = $routerConfig;
33
    }
34
35
    public function setViewEngineConfig(array $config)
36
    {
37
        $this->viewEngineConfig = $config;
38
    }
39
40
    public function setRequest(Request $request)
41
    {
42
        $this->request = $request;
43
    }
44
45
    public function dispatch()
46
    {
47
        $this->buildRouterMap();
48
49
        $viewModel = new ViewModel();
50
        $parameterMap = $this->getParameterMap($viewModel);
51
52
        $returnOfController = $this->executeController($parameterMap);
53
54
        $this->renderView($returnOfController, $viewModel);
55
    }
56
57
    private function buildRouterMap()
58
    {
59
        $builder = new RouterMapBuilder();
60
        $builder->setRouterConfig($this->routerConfig);
61
62
        $this->routerMap = $builder->build();
63
    }
64
65
    /**
66
     * @param  Request   $request   [description]
0 ignored issues
show
Bug introduced by
There is no parameter named $request. Was it maybe removed?

This check looks for PHPDoc comments describing methods or function parameters that do not exist on the corresponding method or function.

Consider the following example. The parameter $italy is not defined by the method finale(...).

/**
 * @param array $germany
 * @param array $island
 * @param array $italy
 */
function finale($germany, $island) {
    return "2:1";
}

The most likely cause is that the parameter was removed, but the annotation was not.

Loading history...
67
     * @param  ViewModel $viewModel [description]
68
     * @return ParameterMap
69
     */
70
    private function getParameterMap(ViewModel $viewModel)
71
    {
72
        $parameterMapper = new ParameterMapper();
73
74
        $parameterMapper->setRequest($this->request);
75
        $parameterMapper->setViewModel($viewModel);
76
        $parameterMapper->setRouterMap($this->routerMap);
77
78
        return $parameterMapper->getParameterMap();
79
    }
80
81
82
    private function executeController(ParameterMap $parameterMap)
83
    {
84
        $dispatcher = new RouterDispatcher($this->routerMap);
85
86
        /**
87
         * TODO 클로저와 일반함수 형태에서도 컨트롤러 이벤트가 작동하도록 수정해야함.
88
         */
89
90
        $this->triggerEvent($this->getControllerEventName() . '.before');
91
        $result = $dispatcher->dispatch($this->request, $parameterMap);
92
        $this->triggerEvent($this->getControllerEventName() . '.after');
93
94
        return $result;
95
    }
96
97
    private function getControllerEventName()
98
    {
99
        $handlerResolvedName = $this->getMatchedHandler()->getResolvedName();
100
        return 'Controller.' . $handlerResolvedName['class'] . '.' . $handlerResolvedName['func'];
101
    }
102
103
    /**
104
     * @return Proc
105
     */
106
    private function getMatchedHandler()
107
    {
108
        $matcher = new Matcher($this->routerMap);
109
        return $matcher->match($this->request)['handler'];
110
    }
111
112
    private function triggerEvent($eventName)
113
    {
114
        Application::getInstance()
115
            ->getEventManager()
116
                ->trigger($eventName);
117
    }
118
119
    private function renderView($returnOfController, ViewModel $viewModel)
120
    {
121
        $view = $this->resolveView($returnOfController);
122
123
        foreach ($viewModel->getVariables() as $key => $value) {
124
            $view->set($key, $value);
125
        }
126
127
        $view->render();
128
    }
129
130
    /**
131
     * @param  mixed $returnOfController
132
     * @return View
133
     */
134
    private function resolveView($returnOfController)
135
    {
136
        $viewResolver = new ViewResolver($returnOfController);
137
        return $viewResolver->resolve($this->viewEngineConfig);
138
    }
139
}
140