Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
2 / 2 |
CRAP | |
100.00% |
12 / 12 |
| Router | |
100.00% |
1 / 1 |
|
100.00% |
11 / 11 |
14 | |
100.00% |
12 / 12 |
| __construct() | |
100.00% |
1 / 1 |
1 | ||||||
| anonymous function () use($ref, $args) | |
100.00% |
1 / 1 |
1 | ||||||
| add($method, $path, callable $cb) | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
| get ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| post ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| put ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| patch ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| delete ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| options($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| head ($path, callable $cb) | |
100.00% |
1 / 1 |
1 | ||||||
| route($method, $path) | |
100.00% |
1 / 1 |
4 | |
100.00% |
7 / 7 |
|||
| <?php | |
| namespace Convey; | |
| use Rize\UriTemplate; | |
| class Router { | |
| private $table = [ | |
| 'GET' => [], | |
| 'POST' => [], | |
| 'PUT' => [], | |
| 'PATCH' => [], | |
| 'DELETE' => [], | |
| 'OPTIONS' => [], | |
| 'HEAD' => [] | |
| ]; | |
| protected $emptyRoute; | |
| public function __construct() { $this->emptyRoute = \Closure::bind(function () {}, null); } | |
| public function add($method, $path, callable $cb) { | |
| $this->table[strtoupper($method)][] = [$path, $cb]; | |
| } | |
| // aliases for common methods | |
| public function get ($path, callable $cb) { self::add('GET', $path, $cb); } | |
| public function post ($path, callable $cb) { self::add('POST', $path, $cb); } | |
| public function put ($path, callable $cb) { self::add('PUT', $path, $cb); } | |
| public function patch ($path, callable $cb) { self::add('PATCH', $path, $cb); } | |
| public function delete ($path, callable $cb) { self::add('DELETE', $path, $cb); } | |
| public function options($path, callable $cb) { self::add('OPTIONS', $path, $cb); } | |
| public function head ($path, callable $cb) { self::add('HEAD', $path, $cb); } | |
| public function route($method, $path) { | |
| $parser = new UriTemplate(); | |
| $results = []; | |
| $routes = $this->table[strtoupper($method)]; | |
| foreach($routes as $route) { | |
| $args = $parser->extract($route[0], $path, true); | |
| if(isset($args)) { | |
| // reflect this function as late as possible, since *most* routes shouldn't be called | |
| $ref = new \ReflectionFunction($route[1]); | |
| $results[] = \Closure::bind(function () use($ref, $args) { return $ref->invokeArgs($args); }, null); | |
| } | |
| } | |
| // always return a callable function inside an array | |
| return empty($results) ? [$this->emptyRoute] : $results; | |
| } | |
| } |