Compare commits
No commits in common. "17bf93874bf25cedd2cd1e5e284c8bf741194414" and "a8b0f2a41069d8e6b5b693419fb197870eedfd2e" have entirely different histories.
17bf93874b
...
a8b0f2a410
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,3 @@
|
|||||||
tests/trees
|
tests/trees
|
||||||
|
|
||||||
/vendor/
|
/vendor/
|
||||||
index.php
|
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "sharkk/router",
|
"name": "sharkk/router",
|
||||||
"description": "A simple node-based router.",
|
"description": "A simple node-based router.",
|
||||||
"version": "1.2.6",
|
"version": "1.2.5",
|
||||||
"type": "library",
|
"type": "library",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"autoload": {
|
"autoload": {
|
||||||
|
|||||||
@ -15,12 +15,12 @@ class Router
|
|||||||
*/
|
*/
|
||||||
public function add(string $method, string $route, callable $handler): Router
|
public function add(string $method, string $route, callable $handler): Router
|
||||||
{
|
{
|
||||||
// expand the route into segments and make dynamic segments into a common placeholder
|
// Expand the route into segments and make dynamic segments into a common placeholder
|
||||||
$segments = array_map(function($segment) {
|
$segments = array_map(function($segment) {
|
||||||
return str_starts_with($segment, ':') ? ':x' : $segment;
|
return str_starts_with($segment, ':') ? ':x' : $segment;
|
||||||
}, explode('/', trim($route, '/')));
|
}, explode('/', trim($route, '/')));
|
||||||
|
|
||||||
// push each segment into the routes array as a node, except if this is the root node
|
// Push each segment into the routes array as a node, except if this is the root node
|
||||||
$node = &$this->routes;
|
$node = &$this->routes;
|
||||||
foreach ($segments as $segment) {
|
foreach ($segments as $segment) {
|
||||||
// skip an empty segment, which allows us to register handlers for the root node
|
// skip an empty segment, which allows us to register handlers for the root node
|
||||||
@ -43,33 +43,20 @@ class Router
|
|||||||
*/
|
*/
|
||||||
public function lookup(string $method, string $uri): array
|
public function lookup(string $method, string $uri): array
|
||||||
{
|
{
|
||||||
// normalize uri to be tolerant of trailing slashes
|
|
||||||
$uri = '/' . trim($uri, '/');
|
|
||||||
|
|
||||||
// node is a reference to our current location in the node tree
|
// node is a reference to our current location in the node tree
|
||||||
$node = $this->routes;
|
$node = $this->routes;
|
||||||
|
|
||||||
// init the response array
|
// params will hold any dynamic segments we find
|
||||||
$res = ['code' => 0, 'handler' => null, 'params' => []];
|
$params = [];
|
||||||
|
|
||||||
// if the URI is just a slash, we can return the handler for the root node
|
// if the URI is just a slash, we can return the handler for the root node
|
||||||
if ($uri === '/') {
|
if ($uri === '/') {
|
||||||
if (!$this->checkForHandlers($node)) {
|
return isset($node[$method])
|
||||||
$res['code'] = 404;
|
? ['code' => 200, 'handler' => $node[$method], 'params' => null]
|
||||||
return $res;
|
: ['code' => 405, 'handler' => null, 'params' => null];
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isset($node[$method])) {
|
// We'll split up the URI into segments and traverse the node tree
|
||||||
$res['code'] = 200;
|
|
||||||
$res['handler'] = $node[$method];
|
|
||||||
} else {
|
|
||||||
$res['code'] = 405;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// we'll split up the URI into segments and traverse the node tree
|
|
||||||
foreach (explode('/', trim($uri, '/')) as $segment) {
|
foreach (explode('/', trim($uri, '/')) as $segment) {
|
||||||
// if there is a node for this segment, move to it
|
// if there is a node for this segment, move to it
|
||||||
if (isset($node[$segment])) {
|
if (isset($node[$segment])) {
|
||||||
@ -79,31 +66,19 @@ class Router
|
|||||||
|
|
||||||
// if there is a dynamic segment, move to it and store the value
|
// if there is a dynamic segment, move to it and store the value
|
||||||
if (isset($node[':x'])) {
|
if (isset($node[':x'])) {
|
||||||
$res['params'][] = $segment;
|
$params[] = $segment;
|
||||||
$node = $node[':x'];
|
$node = $node[':x'];
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we can't find a node for this segment, return 404
|
// if we can't find a node for this segment, return 404
|
||||||
$res['code'] = 404;
|
return ['code' => 404, 'handler' => null, 'params' => []];
|
||||||
return $res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// if no handlers exist at this node, it's not a valid endpoint - return 404
|
|
||||||
if (!$this->checkForHandlers($node)) {
|
|
||||||
$res['code'] = 404;
|
|
||||||
return $res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// if we found a handler for the method, return it and any params. if not, return a 405
|
// if we found a handler for the method, return it and any params. if not, return a 405
|
||||||
if (isset($node[$method])) {
|
return isset($node[$method])
|
||||||
$res['code'] = 200;
|
? ['code' => 200, 'handler' => $node[$method], 'params' => $params ?? []]
|
||||||
$res['handler'] = $node[$method];
|
: ['code' => 405, 'handler' => null, 'params' => []];
|
||||||
} else {
|
|
||||||
$res['code'] = 405;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $res;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -123,21 +98,6 @@ class Router
|
|||||||
return $this->routes;
|
return $this->routes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if a given node has any method handlers.
|
|
||||||
*/
|
|
||||||
private function checkForHandlers(array $node): bool
|
|
||||||
{
|
|
||||||
$hasHandlers = false;
|
|
||||||
foreach (['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'HEAD', 'OPTIONS'] as $m) {
|
|
||||||
if (isset($node[$m])) {
|
|
||||||
$hasHandlers = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $hasHandlers;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a GET route.
|
* Register a GET route.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,12 +1,13 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
require_once 'color.php';
|
require_once 'color.php';
|
||||||
require_once __DIR__ . '/../src/Router.php';
|
require_once __DIR__ . '/../src/RouterInterface.php';
|
||||||
|
require_once __DIR__ . '/../src/SegmentRouter.php';
|
||||||
|
|
||||||
const ROUTES = __DIR__ . '/routes/';
|
const ROUTES = __DIR__ . '/routes/';
|
||||||
const TREES = __DIR__ . '/trees/';
|
const TREES = __DIR__ . '/trees/';
|
||||||
|
|
||||||
use Sharkk\Router\Router;
|
use Sharkk\Router\SegmentRouter;
|
||||||
|
|
||||||
// if there's a flag, reset the opcache
|
// if there's a flag, reset the opcache
|
||||||
if (in_array('-f', $argv)) {
|
if (in_array('-f', $argv)) {
|
||||||
@ -17,7 +18,7 @@ if (in_array('-f', $argv)) {
|
|||||||
// create the trees directory if it doesn't exist
|
// create the trees directory if it doesn't exist
|
||||||
if (!is_dir(TREES)) mkdir(TREES);
|
if (!is_dir(TREES)) mkdir(TREES);
|
||||||
|
|
||||||
$r = new Router();
|
$r = new SegmentRouter();
|
||||||
|
|
||||||
// Blog lookups
|
// Blog lookups
|
||||||
$blog = readAndAddRoutes(ROUTES . 'blog.txt', $r);
|
$blog = readAndAddRoutes(ROUTES . 'blog.txt', $r);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user