Completed
Push — master ( 40f0f7...1eb527 )
by Park Jong-Hun
02:34
created

Dispatcher::getEventName()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 9
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 9
rs 9.6666
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
        $result = $this->execute($parameterMap);
53
        $this->renderView($result, $viewModel);
54
    }
55
56
    private function buildRouterMap()
57
    {
58
        $builder = new RouterMapBuilder();
59
        $builder->setRouterConfig($this->routerConfig);
60
61
        $this->routerMap = $builder->build();
62
    }
63
64
    /**
65
     * @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...
66
     * @param  ViewModel $viewModel [description]
67
     * @return ParameterMap
68
     */
69
    private function getParameterMap(ViewModel $viewModel)
70
    {
71
        $parameterMapper = new ParameterMapper();
72
73
        $parameterMapper->setRequest($this->request);
74
        $parameterMapper->setViewModel($viewModel);
75
        $parameterMapper->setRouterMap($this->routerMap);
76
77
        return $parameterMapper->getParameterMap();
78
    }
79
80
81
    private function execute(ParameterMap $parameterMap)
82
    {
83
        $dispatcher = new RouterDispatcher($this->routerMap);
84
85
        /**
86
         * TODO 클로저와 일반함수 형태에서도 컨트롤러 이벤트가 작동하도록 수정해야함.
87
         */
88
89
        $this->triggerEvent($this->getEventName('before'));
90
        $result = $dispatcher->dispatch($this->request, $parameterMap);
91
        $this->triggerEvent($this->getEventName('after'));
92
93
        return $result;
94
    }
95
96
    private function getEventName($action)
97
    {
98
        $handlerResolvedName = $this->getMatchedHandler()->getResolvedName();
99
        return sprintf('Controller.%s.%s.%s',
100
                            $handlerResolvedName['class'],
101
                            $handlerResolvedName['func'],
102
                            $action
103
        );
104
    }
105
106
    /**
107
     * @return Proc
108
     */
109
    private function getMatchedHandler()
110
    {
111
        $matcher = new Matcher($this->routerMap);
112
        return $matcher->match($this->request)['handler'];
113
    }
114
115
    private function triggerEvent($eventName)
116
    {
117
        Application::getInstance()
118
            ->getEventManager()
119
                ->trigger($eventName);
120
    }
121
122
    private function renderView($controllerResult, ViewModel $viewModel)
123
    {
124
        $view = $this->resolveView($controllerResult);
125
126
        foreach ($viewModel->getVariables() as $key => $value) {
127
            $view->set($key, $value);
128
        }
129
130
        $view->render();
131
    }
132
133
    /**
134
     * @param  mixed $controllerResult
135
     * @return View
136
     */
137
    private function resolveView($controllerResult)
138
    {
139
        $viewResolver = new ViewResolver($controllerResult);
140
        return $viewResolver->resolve($this->viewEngineConfig);
141
    }
142
}
143