Completed
Push — master ( dfaf51...188ba1 )
by Samuel
02:15
created

BaseRouteResolver   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 62
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 4

Test Coverage

Coverage 95.65%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 8
c 1
b 0
f 0
lcom 1
cbo 4
dl 0
loc 62
ccs 22
cts 23
cp 0.9565
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 4 1
A resolve() 0 11 3
B resolveParams() 0 24 4
1
<?php
2
3
namespace Kelemen\ApiNette\Route;
4
5
use Nette\Http\Request;
6
7
class BaseRouteResolver implements RouteResolver
8
{
9
    /** @var Request */
10
    private $request;
11
12
    /**
13
     * @param Request $request
14
     */
15 12
    public function __construct(Request $request)
16
    {
17 12
        $this->request = $request;
18 12
    }
19
20
    /**
21
     * Resolve route for url
22
     * @param RouteContainer $routes
23
     * @param string $url
24
     * @return bool|ResolvedRoute
25
     */
26 12
    public function resolve(RouteContainer $routes, $url)
27
    {
28 12
        foreach ($routes->getRoutes($this->request->getMethod()) as $route) {
29 10
            $params = $this->resolveParams($route, $url);
30 10
            if (is_array($params)) {
31 9
                return new ResolvedRoute($route, $params);
32
            }
33 5
        }
34
35 10
        return false;
36
    }
37
38
    /**
39
     * Resolve parameters for route
40
     * @param Route $route
41
     * @param string $url
42
     * @return array|bool
43
     */
44 10
    private function resolveParams(Route $route, $url)
45
    {
46 10
        preg_match_all('#' . $route->getPregPattern() . '#', $url, $values, PREG_SET_ORDER);
47
48
        // If nothing found
49 10
        if (count($values) === 0) {
50 8
            return false;
51
        }
52
53
        // Remove full match from matches (leave only part matches)
54 8
        $values = $values[0];
55 8
        array_shift($values);
56
57 8
        $result = [];
58 8
        foreach ($route->getParams() as $key => $param) {
59
            // If parameter key is not set in matched values, route not match and return false
60 8
            if (!isset($values[$key])) {
61
                return false;
62
            }
63 8
            $result[$param] = $values[$key];
64 4
        }
65
66 8
        return $result;
67
    }
68
}
69