Completed
Push — dev ( b1013d...c10904 )
by Jonathan
11s queued 10s
created

RestHandler   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 89
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 6
Bugs 1 Features 1
Metric Value
c 6
b 1
f 1
dl 0
loc 89
ccs 48
cts 48
cp 1
rs 10
wmc 4
lcom 1
cbo 2

2 Methods

Rating   Name   Duplication   Size   Complexity  
A isAppropriate() 0 19 3
B getRoutes() 0 41 1
1
<?php
2
3
namespace Vectorface\SnappyRouter\Handler;
4
5
use Vectorface\SnappyRouter\Encoder\JsonEncoder;
6
7
/**
8
 * Handles REST-like URLs like '/api/v2/users/1/details'.
9
 * @copyright Copyright (c) 2014, VectorFace, Inc.
10
 * @author Dan Bruce <[email protected]>
11
 */
12
class RestHandler extends ControllerHandler
13
{
14
    /** Constants indicating the type of route */
15
    const MATCHES_ID = 8;
16
    const MATCHES_CONTROLLER_AND_ID = 9;
17
    const MATCHES_CONTROLLER_ACTION_AND_ID = 11;
18
19
    /** API version pattern */
20
    const ROUTE_PATTERN_VERSION_ONE   = 'v{version:\d+}';
21
    const ROUTE_PATTERN_VERSION_TWO   = 'v{version:\d+\.\d+}';
22
    const ROUTE_PATTERN_VERSION_THREE = 'v{version:\d+\.\d+\.\d+}';
23
24
    /** object ID version pattern */
25
    const ROUTE_PATTERN_OBJECT_ID = '{objectId:\d+}';
26
27
    /**
28
     * Returns true if the handler determines it should handle this request and false otherwise.
29
     * @param string $path The URL path for the request.
30
     * @param array $query The query parameters.
31
     * @param array $post The post data.
32
     * @param string $verb The HTTP verb used in the request.
33
     * @return boolean Returns true if this handler will handle the request and false otherwise.
34
     */
35 10
    public function isAppropriate($path, $query, $post, $verb)
36
    {
37
        // use the parent method to match the routes
38 10
        if (false === parent::isAppropriate($path, $query, $post, $verb)) {
39 2
            return false;
40
        }
41
42
        // determine the route information from the path
43 8
        $routeInfo = $this->getRouteInfo($verb, $path, true);
44 8
        $this->routeParams = array($routeInfo[2]['version']);
45 8
        if ($routeInfo[1] & self::MATCHES_ID) {
46 2
            $this->routeParams[] = intval($routeInfo[2]['objectId']);
47 2
        }
48
49
        // use JSON encoder by default
50 8
        $this->encoder = new JsonEncoder();
51
52 8
        return true;
53
    }
54
55
    /**
56
     * Returns the array of routes.
57
     * @return array The array of routes.
58
     */
59 10
    protected function getRoutes()
60
    {
61 10
        $c = parent::ROUTE_PATTERN_CONTROLLER;
62 10
        $a = parent::ROUTE_PATTERN_ACTION;
63 10
        $v1 = self::ROUTE_PATTERN_VERSION_ONE;
64 10
        $v2 = self::ROUTE_PATTERN_VERSION_TWO;
65 10
        $v3 = self::ROUTE_PATTERN_VERSION_THREE;
66 10
        $o = self::ROUTE_PATTERN_OBJECT_ID;
67
        return array(
68 10
            "/$v1/$c" => self::MATCHES_CONTROLLER,
69 10
            "/$v1/$c/" => self::MATCHES_CONTROLLER,
70 10
            "/$v2/$c" => self::MATCHES_CONTROLLER,
71 10
            "/$v2/$c/" => self::MATCHES_CONTROLLER,
72 10
            "/$v3/$c" => self::MATCHES_CONTROLLER,
73 10
            "/$v3/$c/" => self::MATCHES_CONTROLLER,
74 10
            "/$v1/$c/$a" => self::MATCHES_CONTROLLER_AND_ACTION,
75 10
            "/$v1/$c/$a/" => self::MATCHES_CONTROLLER_AND_ACTION,
76 10
            "/$v2/$c/$a" => self::MATCHES_CONTROLLER_AND_ACTION,
77 10
            "/$v2/$c/$a/" => self::MATCHES_CONTROLLER_AND_ACTION,
78 10
            "/$v3/$c/$a" => self::MATCHES_CONTROLLER_AND_ACTION,
79 10
            "/$v3/$c/$a/" => self::MATCHES_CONTROLLER_AND_ACTION,
80 10
            "/$v1/$c/$o" => self::MATCHES_CONTROLLER_AND_ID,
81 10
            "/$v1/$c/$o/" => self::MATCHES_CONTROLLER_AND_ID,
82 10
            "/$v2/$c/$o" => self::MATCHES_CONTROLLER_AND_ID,
83 10
            "/$v2/$c/$o/" => self::MATCHES_CONTROLLER_AND_ID,
84 10
            "/$v3/$c/$o" => self::MATCHES_CONTROLLER_AND_ID,
85 10
            "/$v3/$c/$o/" => self::MATCHES_CONTROLLER_AND_ID,
86 10
            "/$v1/$c/$a/$o" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
87 10
            "/$v1/$c/$a/$o/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
88 10
            "/$v1/$c/$o/$a" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
89 10
            "/$v1/$c/$o/$a/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
90 10
            "/$v2/$c/$a/$o" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
91 10
            "/$v2/$c/$a/$o/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
92 10
            "/$v2/$c/$o/$a" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
93 10
            "/$v2/$c/$o/$a/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
94 10
            "/$v3/$c/$a/$o" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
95 10
            "/$v3/$c/$a/$o/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
96 10
            "/$v3/$c/$o/$a" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
97 10
            "/$v3/$c/$o/$a/" => self::MATCHES_CONTROLLER_ACTION_AND_ID,
98 10
        );
99
    }
100
}
101