Completed
Push — master ( 615c84...1feb1c )
by Auke
04:12
created

route::match()   B

Complexity

Conditions 4
Paths 3

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 18
CRAP Score 4.016

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 25
ccs 18
cts 20
cp 0.9
rs 8.5806
cc 4
eloc 18
nc 3
nop 2
crap 4.016
1
<?php
2
3
namespace arc;
4
/**
5
 * Class route
6
 * A simple router.
7
 * @package arc
8
 */
9
class route {
10
11
    /**
12
     * Matches a path or url to a list of routes and calls the best matching route handler.
13
     * @param string $path
14
     * @param mixed $routes A tree of routes with handlers as nodeValue.
15
     * @return array|bool
16
     */
17 4
    public static function match($path, $routes) {
18 4
        $routes     = \arc\tree::expand($routes);
19 4
        $controller = \arc\tree::dive(
20 4
            $routes->cd($path),
21 4
            function($node) {
22 4
                if ( isset($node->nodeValue) ) {
23 4
                    return $node;
24
                }
25 4
            }
26 2
        );
27 4
        if ( $controller ) {
28 4
            $remainder = substr( $path, strlen($controller->getPath()) );
29 4
            if ( is_callable($controller->nodeValue) ) {
30 4
                $result = call_user_func($controller->nodeValue, $remainder);
31 2
            } else {
32
                $result = $controller->nodeValue;
33
            }
34
            return [
35 4
                'path' => $controller->getPath(),
36 4
                'remainder' => $remainder,
37 2
                'result' => $result
38 2
            ];
39
        }
40
        return false;
41
    }
42
43
}