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.

Router   A
last analyzed

Complexity

Total Complexity 29

Size/Duplication

Total Lines 214
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 29
lcom 1
cbo 8
dl 0
loc 214
ccs 82
cts 82
cp 1
rs 10
c 0
b 0
f 0

15 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 12 1
B setOptions() 0 24 7
A addRouteFromConfig() 0 13 5
A getDefaultModule() 0 4 1
A getDefaultController() 0 4 1
A getDefaultAction() 0 4 1
A addRoute() 0 7 2
A clearRoutes() 0 4 1
A getRoutes() 0 4 1
A route() 0 36 3
A getControllerClass() 0 15 2
A getActionMethod() 0 4 1
A getRequestModule() 0 4 1
A getRequestController() 0 4 1
A getRequestAction() 0 4 1
1
<?php declare(strict_types=1);
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
class Router implements RouterInterface
20
{
21
    /**
22
     * @var BaseApp
23
     */
24
    protected $app;
25
26
    /**
27
     * @var RouteCollection
28
     */
29
    protected $routes;
30
31
    /**
32
     * @var string
33
     */
34
    protected $controllerNamespace = 'App\\Controller';
35
36
    /**
37
     * @var string|null
38
     */
39
    protected $defaultModule;
40
41
    /**
42
     * @var string
43
     */
44
    protected $defaultController = 'index';
45
46
    /**
47
     * @var string
48
     */
49
    protected $defaultAction = 'index';
50
51
    /**
52
     * @var string
53
     */
54
    protected $controllerClassSuffix = 'Controller';
55
56
    /**
57
     * @var string
58
     */
59
    protected $actionMethodSuffix = 'Action';
60
61 11
    public function __construct(BaseApp $app, array $options = [])
62
    {
63 11
        $this->app = $app;
64 11
        $this->routes = new RouteCollection();
65
66 11
        $this->setOptions($options);
67
68
        // Default routes
69 11
        $this->addRoute(new Route('/'));
70 11
        $this->addRoute(new Route('/{action}', [], ['action' => '[a-z-]+']));
71 11
        $this->addRoute(new Route('/{controller}/{action}', [], ['controller' => '[a-z-]+', 'action' => '[a-z-]+']));
72 11
    }
73
74 11
    public function setOptions(array $options): void
75
    {
76 11
        if (isset($options['controllerNamespace'])) {
77 11
            $this->controllerNamespace = $options['controllerNamespace'];
78
        }
79
80 11
        if (isset($options['defaultModule'])) {
81 1
            $this->defaultModule = $options['defaultModule'];
82
        }
83
84 11
        if (isset($options['defaultController'])) {
85 1
            $this->defaultController = $options['defaultController'];
86
        }
87
88 11
        if (isset($options['defaultAction'])) {
89 1
            $this->defaultAction = $options['defaultAction'];
90
        }
91
92 11
        if (!empty($options['routes'])) {
93 1
            foreach ($options['routes'] as $nameOrPath => $routeConfig) {
94 1
                $this->addRouteFromConfig($nameOrPath, $routeConfig);
95
            }
96
        }
97 11
    }
98
99 1
    private function addRouteFromConfig(string $name, array $routeConfig): void
100
    {
101 1
        if (\array_key_exists('path', $routeConfig)) {
102 1
            $path = $routeConfig['path'];
103
        } else {
104 1
            $path = $name;
105
        }
106
107 1
        $defaults = isset($routeConfig['defaults']) ? $routeConfig['defaults'] : [];
108 1
        $requirements = isset($routeConfig['requirements']) ? $routeConfig['requirements'] : [];
109 1
        $methods = isset($routeConfig['methods']) ? $routeConfig['methods'] : [];
110 1
        $this->addRoute(new Route($path, $defaults, $requirements, [], '', [], $methods), $name);
111 1
    }
112
113 1
    public function getDefaultModule(): string
114
    {
115 1
        return $this->defaultModule;
116
    }
117
118 1
    public function getDefaultController(): string
119
    {
120 1
        return $this->defaultController;
121
    }
122
123 1
    public function getDefaultAction(): string
124
    {
125 1
        return $this->defaultAction;
126
    }
127
128 11
    public function addRoute(Route $route, string $name = null): void
129
    {
130 11
        if ($name === null) {
131 11
            $name = $route->getPath();
132
        }
133 11
        $this->routes->add($name, $route);
134 11
    }
135
136 1
    public function clearRoutes(): void
137
    {
138 1
        $this->routes = new RouteCollection();
139 1
    }
140
141 3
    public function getRoutes(): RouteCollection
142
    {
143 3
        return $this->routes;
144
    }
145
146
    /**
147
     * Resolve controller action and return callable properties.
148
     *
149
     * @throws ResourceNotFoundException
150
     */
151 3
    public function route(Request $request): AbstractController
152
    {
153
        // Match route
154 3
        $context = new RequestContext();
155 3
        $context->fromRequest($request);
156 3
        $matcher = new UrlMatcher($this->routes, $context);
157
158 3
        $match = $matcher->match($request->getPathInfo());
159 3
        $request->attributes->add($match);
160
161
162
        // Set request properties with defaults
163 3
        $module = $this->getRequestModule($request);
164 3
        $controller = $this->getRequestController($request);
165 3
        $action = $this->getRequestAction($request);
166 3
        $request->attributes->add(\compact('module', 'controller', 'action'));
167
168
        // Get callable names
169 3
        $controllerClass = $this->getControllerClass($controller, $module);
170 3
        $actionMethod = $this->getActionMethod($action);
171
172
        // Check that controller exist
173 3
        if (!\class_exists($controllerClass)) {
174 1
            throw new ResourceNotFoundException("Controller \"{$controllerClass}\" does not exist");
175
        }
176
177
        // Check that action exist (we don't use method_exists because PHP's method case insensitivity)
178 2
        $controllerMethods = \get_class_methods($controllerClass);
179 2
        if (!in_array($actionMethod, $controllerMethods, true)) {
180 1
            throw new ResourceNotFoundException("Action method \"{$controllerClass}::{$actionMethod}\" does not exist");
181
        }
182
183 1
        $actualController = new $controllerClass($this->app, $request);
184
185 1
        return $actualController;
186
    }
187
188
    /**
189
     * @param string      $controller Controller name as lowercase dash-separated string
190
     * @param string|null $module     Module as lowercase separated string
191
     * @return string
192
     */
193 4
    public function getControllerClass(string $controller, string $module = null): string
194
    {
195 4
        $moduleNamespace = null;
196 4
        if (!empty($module)) {
197 1
            $moduleNamespace = Str::separatorToCamel($module, '-', true);
198
        }
199
200 4
        $controllerClassName = Str::separatorToCamel($controller, '-', true) . $this->controllerClassSuffix;
201
202 4
        return '\\' . \implode('\\', \array_filter([
203 4
            $moduleNamespace,
204 4
            $this->controllerNamespace,
205 4
            $controllerClassName
206
        ]));
207
    }
208
209
    /**
210
     * @param string $action Action name as lowercase dash-separated string
211
     * @return string
212
     */
213 4
    public function getActionMethod(string $action): string
214
    {
215 4
        return Str::separatorToCamel($action, '-') . $this->actionMethodSuffix;
216
    }
217
218 3
    public function getRequestModule(Request $request): ?string
219
    {
220 3
        return $request->attributes->get('module', $this->defaultModule);
221
    }
222
223 3
    public function getRequestController(Request $request): string
224
    {
225 3
        return $request->attributes->get('controller', $this->defaultController);
226
    }
227
228 3
    public function getRequestAction(Request $request): string
229
    {
230 3
        return $request->attributes->get('action', $this->defaultAction);
231
    }
232
}
233