Completed
Push — master ( 077cc3...47a35a )
by Samuel
10s
created

BaseRouteResolver::resolveParams()   A

Complexity

Conditions 2
Paths 2

Size

Total Lines 20
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 11
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 20
ccs 11
cts 11
cp 1
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 11
nc 2
nop 2
crap 2
1
<?php
2
3
namespace Kelemen\ApiNette\Route;
4
5
use Nette\Http\Request;
6
7
class BaseRouteResolver implements RouteResolverInterface
8
{
9
    /** @var Request */
10
    private $request;
11
12
    /**
13
     * @param Request $request
14
     */
15 36
    public function __construct(Request $request)
16
    {
17 36
        $this->request = $request;
18 36
    }
19
20
    /**
21
     * Resolve route for url
22
     * @param RouteContainer $routes
23
     * @param string $url
24
     * @return bool|ResolvedRoute
25
     */
26 34
    public function resolve(RouteContainer $routes, $url)
27
    {
28 34
        foreach ($routes->getRoutes($this->request->getMethod()) as $route) {
29 34
            $params = $this->resolveParams($route, $url);
30 34
            if (is_array($params)) {
31 30
                return new ResolvedRoute($route, $params);
32
            }
33 18
        }
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 34
    private function resolveParams(Route $route, $url)
45
    {
46 34
        preg_match_all('#' . $route->getPregPattern() . '#', $url, $values, PREG_SET_ORDER);
47
48
        // If nothing found
49 34
        if (count($values) === 0) {
50 18
            return false;
51
        }
52
53
        // Remove full match from matches (leave only part matches)
54 30
        $values = $values[0];
55 30
        array_shift($values);
56
57 30
        $routeParams = $route->getParams();
58 30
        $result = array_filter($values, function ($param) use ($routeParams) {
59 20
            return in_array($param, $routeParams, true);
60 30
        }, ARRAY_FILTER_USE_KEY);
61
62 30
        return $result;
63
    }
64
}
65