Test Failed
Pull Request — master (#19)
by Flo
02:48
created

AbstractController::route()   B

Complexity

Conditions 6
Paths 15

Size

Total Lines 29
Code Lines 14

Duplication

Lines 8
Ratio 27.59 %

Importance

Changes 0
Metric Value
dl 8
loc 29
rs 8.439
c 0
b 0
f 0
cc 6
eloc 14
nc 15
nop 3
1
<?php
2
/**
3
 * Class AbstractController
4
 *
5
 * @package Faulancer\AbstractController
6
 * @author Florian Knapp <[email protected]>
7
 */
8
namespace Faulancer\Controller;
9
10
use Faulancer\Cache\Cache;
11
use Faulancer\Cache\CacheableInterface;
12
use Faulancer\Exception\RouteInvalidException;
13
use Faulancer\Http\Request;
14
use Faulancer\Http\Response;
15
use Faulancer\Service\AuthenticatorService;
16
use Faulancer\Service\Config;
17
use Faulancer\Service\DbService;
18
use Faulancer\Service\HttpService;
19
use Faulancer\Service\SessionManagerService;
20
use Faulancer\ServiceLocator\ServiceInterface;
21
use Faulancer\Session\SessionManager;
22
use Faulancer\View\ViewController;
23
use Faulancer\ServiceLocator\ServiceLocator;
24
25
/**
26
 * Class AbstractController
27
 */
28
abstract class AbstractController
29
{
30
31
    /**
32
     * Holds the views per controller request
33
     * @var array
34
     */
35
    private $viewArray = [];
36
37
    /**
38
     * @var Request
39
     */
40
    protected $request;
41
42
    /**
43
     * AbstractController constructor.
44
     * @param Request $request
45
     */
46
    public function __construct(Request $request)
47
    {
48
        $this->request = $request;
49
    }
50
51
    /**
52
     * Returns the service locator
53
     *
54
     * @return ServiceLocator
55
     */
56
    public function getServiceLocator() :ServiceLocator
57
    {
58
        return ServiceLocator::instance();
59
    }
60
61
    /**
62
     * Returns the session manager
63
     *
64
     * @return SessionManagerService|ServiceInterface
65
     */
66
    public function getSessionManager() :SessionManagerService
67
    {
68
        return $this->getServiceLocator()->get(SessionManagerService::class);
69
    }
70
71
    /**
72
     * Returns the view controller
73
     *
74
     * @return ViewController
75
     */
76
    public function getView() :ViewController
77
    {
78
        $calledClass = get_called_class();
79
80
        if (in_array($calledClass, array_keys($this->viewArray))) {
81
            return $this->viewArray[$calledClass];
82
        }
83
84
        $viewController = new ViewController();
85
        $this->viewArray[$calledClass] = $viewController;
86
87
        return $viewController;
88
    }
89
90
    /**
91
     * Returns the orm/entity manager
92
     *
93
     * @return DbService|ServiceInterface
94
     */
95
    public function getDb() :DbService
96
    {
97
        return $this->getServiceLocator()->get(DbService::class);
98
    }
99
100
    /**
101
     * Render view with given template
102
     *
103
     * @param  string $template
104
     * @param  array $variables
105
     * @return Response
106
     */
107
    public function render(string $template = '', $variables = []) :Response
108
    {
109
        return new Response($this->getView()->setTemplate($template)->setVariables($variables)->render());
110
    }
111
112
    /**
113
     * Set required authentication
114
     *
115
     * @param array $role
116
     * @return bool
117
     */
118
    public function requireAuth($role) :bool
119
    {
120
        /** @var AuthenticatorService $authenticator */
121
        $authenticator = $this->getServiceLocator()->get(AuthenticatorService::class);
122
123
        if ($authenticator->isAuthenticated($role) === false) {
124
            return $authenticator->redirectToAuthentication();
125
        }
126
127
        return true;
128
    }
129
130
    /**
131
     * @param string $uri
132
     * @return bool
133
     */
134
    public function redirect(string $uri) :bool
135
    {
136
        /** @var HttpService $httpService */
137
        $httpService = $this->getServiceLocator()->get(HttpService::class);
138
        return $httpService->redirect($uri);
139
    }
140
141
    /**
142
     * @param string $key
143
     * @param string $message
144
     */
145
    public function setFlashMessage(string $key, string $message)
146
    {
147
        $sessionManager = $this->getSessionManager();
148
        $sessionManager->setFlashMessage($key, $message);
149
    }
150
151
    /**
152
     * @param $key
153
     * @return string|null
154
     */
155
    public function getFlashMessage(string $key)
156
    {
157
        $sessionManager = $this->getSessionManager();
158
        return $sessionManager->getFlashMessage($key);
159
    }
160
161
    /**
162
     * @param string $name
163
     * @param array  $parameters
164
     * @param bool   $absolute
165
     *
166
     * @return string
167
     * @throws RouteInvalidException
168
     */
169
    public function route(string $name, array $parameters = [], $absolute = false)
170
    {
171
        /** @var Config $config */
172
        $config = $this->getServiceLocator()->get(Config::class);
173
        $routes = $config->get('routes');
174
175 View Code Duplication
        foreach ($routes as $routeName => $routeConfig) {
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
176
177
            if ($routeName === $name) {
178
                $path = preg_replace('|/\((.*)\)|', '', $routeConfig['path']);
179
                break;
180
            }
181
182
        }
183
184
        if (empty($path)) {
185
            throw new RouteInvalidException('No route for name "' . $name . '" found');
186
        }
187
188
        if (!empty($parameters)) {
189
            $path = $path . '/' . implode('/', $parameters);
190
        }
191
192
        if ($absolute) {
193
            $path = $this->getRequest()->getScheme() . $this->getRequest()->getHost() . $path;
194
        }
195
196
        return $path;
197
    }
198
199
    /**
200
     * @return Request
201
     */
202
    public function getRequest() :Request
203
    {
204
        return $this->request;
205
    }
206
207
}