Completed
Push — master ( 8e452b...a34111 )
by Park Jong-Hun
02:44
created

ControllerDispatcher::setViewEngineConfig()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 4
rs 10
cc 1
eloc 2
nc 1
nop 1
1
<?php
2
3
namespace Core;
4
5
use Prob\Handler\ParameterMap;
6
use Prob\Router\Dispatcher;
7
use Prob\Rewrite\Request;
8
use Prob\Router\Matcher;
9
use Prob\Router\Map;
10
11
class ControllerDispatcher
12
{
13
14
    /**
15
     * @var Map
16
     */
17
    private $routerMap;
18
    private $routerConfig = [];
19
    private $viewEngineConfig = [];
20
21
    public function setRouterConfig(array $routerConfig)
22
    {
23
        $this->routerConfig = $routerConfig;
24
    }
25
26
    public function setViewEngineConfig(array $config)
27
    {
28
        $this->viewEngineConfig = $config;
29
    }
30
31
    public function dispatch(Request $request)
32
    {
33
        $this->buildRouterMap();
34
35
        $viewModel = new ViewModel();
36
        $parameterMap = $this->getControllerParameterMap($request, $viewModel);
37
        $returnOfController = $this->executeController($request, $parameterMap);
38
39
        $this->renderView($returnOfController, $viewModel);
40
    }
41
42
    private function buildRouterMap()
43
    {
44
        $builder = new RouterMapBuilder();
45
        $builder->setRouterConfig($this->routerConfig);
46
47
        $this->routerMap = $builder->build();
48
    }
49
50
    private function getControllerParameterMap(Request $request, ViewModel $viewModel)
51
    {
52
        $url = $this->resolveUrl($request);
53
54
        $parameterMap = new ParameterMap();
55
        $this->bindUrlParameter($parameterMap, $url);
56
        $this->bindViewModelParameter($parameterMap, $viewModel);
57
58
        return $parameterMap;
59
    }
60
61
    private function resolveUrl(Request $request)
62
    {
63
        $matcher = new Matcher($this->routerMap);
64
        return $matcher->match($request)['urlNameMatching'] ?: [];
65
    }
66
67
    private function bindUrlParameter(ParameterMap $map, array $url)
68
    {
69
        $map->bindByNameWithType('array', 'url', $url);
70
71
        foreach ($url as $name => $value) {
72
            $map->bindByName($name, $value);
73
        }
74
    }
75
76
    private function bindViewModelParameter(ParameterMap $map, ViewModel $viewModel)
77
    {
78
        $map->bindByType(ViewModel::class, $viewModel);
79
    }
80
81
82
    private function executeController(Request $request, ParameterMap $parameterMap)
83
    {
84
        $dispatcher = new Dispatcher($this->routerMap);
85
        return $dispatcher->dispatch($request, $parameterMap);
86
    }
87
88
    private function renderView($returnOfController, ViewModel $viewModel)
89
    {
90
        $view = $this->resolveView($returnOfController);
91
92
        foreach ($viewModel->getVariables() as $key => $value) {
93
            $view->set($key, $value);
94
        }
95
96
        $view->render();
97
    }
98
99
    /**
100
     * @param  mixed $returnOfController
101
     * @return View
102
     */
103
    private function resolveView($returnOfController)
104
    {
105
        $viewResolver = new ViewResolver($returnOfController);
106
        return $viewResolver->resolve($this->viewEngineConfig);
107
    }
108
}
109