GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Pull Request — master (#1)
by
unknown
02:07
created

Router::addRouteFromConfig()   A

Complexity

Conditions 4
Paths 8

Size

Total Lines 7

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 4

Importance

Changes 0
Metric Value
dl 0
loc 7
ccs 6
cts 6
cp 1
rs 10
c 0
b 0
f 0
cc 4
nc 8
nop 3
crap 4
1
<?php
2
/**
3
 * Starlit App.
4
 *
5
 * @copyright Copyright (c) 2016 Starweb AB
6
 * @license   BSD 3-Clause
7
 */
8
9
namespace Starlit\App;
10
11
use Symfony\Component\HttpFoundation\Request;
12
use Symfony\Component\Routing\Route;
13
use Symfony\Component\Routing\RouteCollection;
14
use Symfony\Component\Routing\RequestContext;
15
use Symfony\Component\Routing\Matcher\UrlMatcher;
16
use Symfony\Component\Routing\Exception\ResourceNotFoundException;
17
use Starlit\Utils\Str;
18
19
/**
20
 * Class for routing URL request to controllers.
21
 *
22
 * @author Andreas Nilsson <http://github.com/jandreasn>
23
 */
24
class Router
25
{
26
    /**
27
     * @var BaseApp
28
     */
29
    protected $app;
30
31
    /**
32
     * @var RouteCollection
33
     */
34
    protected $routes;
35
36
    /**
37
     * @var string
38
     */
39
    protected $controllerNamespace = 'App\\Controller';
40
41
    /**
42
     * @var string|null
43
     */
44
    protected $defaultModule;
45
46
    /**
47
     * @var string
48
     */
49
    protected $defaultController = 'index';
50
51
    /**
52
     * @var string
53
     */
54
    protected $defaultAction = 'index';
55
56
    /**
57
     * @var string
58
     */
59
    protected $controllerClassSuffix = 'Controller';
60
61
    /**
62
     * @var string
63
     */
64
    protected $actionMethodSuffix = 'Action';
65
66
    /**
67
     * Constructor.
68
     *
69
     * @param BaseApp $app
70
     * @param array   $options
71
     */
72 11
    public function __construct(BaseApp $app, array $options = [])
73
    {
74 11
        $this->app = $app;
75 11
        $this->routes = new RouteCollection();
76
77 11
        $this->setOptions($options);
78
79
        // Default routes
80 11
        $this->addRoute(new Route('/'));
81 11
        $this->addRoute(new Route('/{action}', [], ['action' => '[a-z-]+']));
82 11
        $this->addRoute(new Route('/{controller}/{action}', [], ['controller' => '[a-z-]+', 'action' => '[a-z-]+']));
83 11
    }
84
85
    /**
86
     * @param array $options
87
     */
88 11
    public function setOptions(array $options)
89
    {
90 11
        if (isset($options['controllerNamespace'])) {
91 11
            $this->controllerNamespace = $options['controllerNamespace'];
92
        }
93
94 11
        if (isset($options['defaultModule'])) {
95 1
            $this->defaultModule = $options['defaultModule'];
96
        }
97
98 11
        if (isset($options['defaultController'])) {
99 1
            $this->defaultController = $options['defaultController'];
100
        }
101
102 11
        if (isset($options['defaultAction'])) {
103 1
            $this->defaultAction = $options['defaultAction'];
104
        }
105
106 11
        if (!empty($options['routes'])) {
107 1
            foreach ($options['routes'] as $name => $routeConfig) {
108 1
                if (array_key_exists('path', $routeConfig)) {
109 1
                    $path = $routeConfig['path'];
110
                } else {
111 1
                    $path = $name;
112
                }
113 1
                $this->addRouteFromConfig($path, $routeConfig, $name);
114
            }
115
        }
116 11
    }
117
118
    /**
119
     * @param string $path
120
     * @param array $routeConfig
121
     */
122 1
    private function addRouteFromConfig($path, array $routeConfig, $name)
123
    {
124 1
        $defaults = isset($routeConfig['defaults']) ? $routeConfig['defaults'] : [];
125 1
        $requirements = isset($routeConfig['requirements']) ? $routeConfig['requirements'] : [];
126 1
        $methods = isset($routeConfig['methods']) ? $routeConfig['methods'] : [];
127 1
        $this->addRoute(new Route($path, $defaults, $requirements, [], '', [], $methods), $name);
128 1
    }
129
130
    /**
131
     * @return string
132
     */
133 1
    public function getDefaultModule()
134
    {
135 1
        return $this->defaultModule;
136
    }
137
138
    /**
139
     * @return string
140
     */
141 1
    public function getDefaultController()
142
    {
143 1
        return $this->defaultController;
144
    }
145
146
    /**
147
     * @return string
148
     */
149 1
    public function getDefaultAction()
150
    {
151 1
        return $this->defaultAction;
152
    }
153
154
    /**
155
     * Add route.
156
     *
157
     * @param Route $route
158
     * @param string|null $route
159
     */
160 11
    public function addRoute(Route $route, $name = null)
161
    {
162 11
        if (null === $name) {
163 11
            $name = $route->getPath();
164
        }
165 11
        $this->routes->add($name, $route);
166 11
    }
167
168
    /**
169
     * Clear any added routes.
170
     */
171 1
    public function clearRoutes()
172
    {
173 1
        $this->routes = new RouteCollection();
174 1
    }
175
176
    /**
177
     * Get routes collection.
178
     *
179
     * @return RouteCollection|Route[]
180
     */
181 3
    public function getRoutes()
182
    {
183 3
        return $this->routes;
184
    }
185
186
    /**
187
     * Resolve controller action and return callable properties.
188
     *
189
     * @param Request $request
190
     * @return AbstractController
191
     * @throws ResourceNotFoundException
192
     */
193 3
    public function route(Request $request)
194
    {
195
        // Match route
196 3
        $context = new RequestContext();
197 3
        $context->fromRequest($request);
198 3
        $matcher = new UrlMatcher($this->routes, $context);
199
200 3
        $match = $matcher->match($request->getPathInfo());
201 3
        $request->attributes->add($match);
202
203
204
        // Set request properties with defaults
205 3
        $module = $this->getRequestModule($request);
206 3
        $controller = $this->getRequestController($request);
207 3
        $action = $this->getRequestAction($request);
208 3
        $request->attributes->add(compact('module', 'controller', 'action'));
209
210
        // Get callable names
211 3
        $controllerClass = $this->getControllerClass($controller, $module);
212 3
        $actionMethod = $this->getActionMethod($action);
213
214
        // Check that controller exist
215 3
        if (!class_exists($controllerClass)) {
216 1
            throw new ResourceNotFoundException("Controller \"{$controllerClass}\" does not exist");
217
        }
218
219
        // Check that action exist (we don't use method_exists because PHP's method case insensitivity)
220 2
        $controllerMethods = get_class_methods($controllerClass);
221 2
        if (!in_array($actionMethod, $controllerMethods, true)) {
222 1
            throw new ResourceNotFoundException("Action method \"{$controllerClass}::{$actionMethod}\" does not exist");
223
        }
224
225 1
        $actualController = new $controllerClass($this->app, $request);
226
227 1
        return $actualController;
228
    }
229
230
    /**
231
     * @param string      $controller Controller name as lowercase separated string
232
     * @param string|null $module     Module as lowercase separated string
233
     * @return string
234
     */
235 4
    public function getControllerClass($controller, $module = null)
236
    {
237 4
        $moduleNamespace = null;
238 4
        if (!empty($module)) {
239 1
            $moduleNamespace = Str::separatorToCamel($module, '-', true);
240
        }
241
242 4
        $controllerClassName = Str::separatorToCamel($controller, '-', true) . $this->controllerClassSuffix;
243
244 4
        return '\\' . implode('\\', array_filter([
245 4
            $moduleNamespace,
246 4
            $this->controllerNamespace,
247 4
            $controllerClassName
248
        ]));
249
    }
250
251
    /**
252
     * @param string $action Action name as lowercase separated string
253
     * @return string
254
     */
255 4
    public function getActionMethod($action)
256
    {
257 4
        return Str::separatorToCamel($action, '-') . $this->actionMethodSuffix;
258
    }
259
260
    /**
261
     * @param Request $request
262
     * @return string
263
     */
264 3
    public function getRequestModule(Request $request)
265
    {
266 3
        return $request->attributes->get('module', $this->defaultModule);
267
    }
268
269
    /**
270
     * @param Request $request
271
     * @return string
272
     */
273 3
    public function getRequestController(Request $request)
274
    {
275 3
        return $request->attributes->get('controller', $this->defaultController);
276
    }
277
278
    /**
279
     * @param Request $request
280
     * @return string
281
     */
282 3
    public function getRequestAction(Request $request)
283
    {
284 3
        return $request->attributes->get('action', $this->defaultAction);
285
    }
286
}
287