Cleanup WillySoft\Http\Route

This commit is contained in:
William 2023-01-27 10:09:12 +00:00
parent 1bd9c5d5dd
commit 254b3e9f56
1 changed files with 28 additions and 42 deletions

View File

@ -2,74 +2,61 @@
namespace WillySoft\Http; namespace WillySoft\Http;
abstract class Route abstract class Route {
{ static array $groups = [
public static array $groups = [
// default global group
[] []
]; ];
public static function match(string $methods, string $path, callable $callback) static function match(string $methods, string $path, callable $callback) {
{
// check if request methods match
if (!in_array($_SERVER['REQUEST_METHOD'], if (!in_array($_SERVER['REQUEST_METHOD'],
array_map(strtoupper(...), explode('|', $methods)) array_map(strtoupper(...), explode('|', $methods))
)) return; )) return;
// check if the route matches and add parameters if any $callback_args = [];
$args = []; $request_path = urldecode($_SERVER['REQUEST_URI']);
$request_path = (function() {
$haystack = strtok($_SERVER['REQUEST_URI'], '?');
$needle = dirname($_SERVER['SCRIPT_NAME']);
if ($needle === '/') {
$needle = '';
}
$pos = strpos($haystack, $needle);
return substr_replace($haystack, '', $pos, strlen($needle));
})();
$path_parts = explode('/', $path); $path_parts = explode('/', $path);
$request_path_parts = explode('/', $request_path); $request_path_parts = explode('/', $request_path);
for ($i=0; $i < count($path_parts); $i++) { for ($i=0; $i < count($path_parts); $i++) {
if (empty($path_parts[$i])) { if (empty($path_parts[$i])) {
continue; continue;
} }
if ($path_parts[$i][0] === '$') { if ($path_parts[$i][0] !== '$') {
if (!isset($request_path_parts[$i])) { continue;
return;
}
if ($path_parts[$i][-1] !== '?' && empty($request_path_parts[$i])) {
return;
}
if (!empty($request_path_parts[$i])) {
$args[] = $request_path_parts[$i];
}
$request_path_parts[$i] = $path_parts[$i];
} }
if (!isset($request_path_parts[$i])) {
return;
}
if ($path_parts[$i][-1] !== '?' && empty($request_path_parts[$i])) {
return;
}
if (!empty($request_path_parts[$i])) {
$callback_args[] = $request_path_parts[$i];
}
$request_path_parts[$i] = $path_parts[$i];
} }
if ( if (
implode('/', $path_parts) !== implode('/', $request_path_parts) implode('/', $path_parts) !== implode('/', $request_path_parts)
) return; ) return;
// we have a match! run the middlewares before the callback before we die :)
foreach (self::$groups as $middlewares) { foreach (self::$groups as $middlewares) {
foreach ($middlewares as $middleware) { foreach ($middlewares as $middleware) {
$middleware(); $middleware();
} }
} }
$callback(...$args); $callback(...$callback_args);
die(); die();
} }
public static function get(string $path, callable $callback) { self::match('get', $path, $callback); } static function get(string $path, callable $callback) { self::match('get', $path, $callback); }
public static function post(string $path, callable $callback) { self::match('post', $path, $callback); } static function post(string $path, callable $callback) { self::match('post', $path, $callback); }
public static function put(string $path, callable $callback) { self::match('put', $path, $callback); } static function put(string $path, callable $callback) { self::match('put', $path, $callback); }
public static function patch(string $path, callable $callback) { self::match('patch', $path, $callback); } static function patch(string $path, callable $callback) { self::match('patch', $path, $callback); }
public static function delete(string $path, callable $callback) { self::match('delete', $path, $callback); } static function delete(string $path, callable $callback) { self::match('delete', $path, $callback); }
public static function options(string $path, callable $callback) { self::match('options', $path, $callback); } static function options(string $path, callable $callback) { self::match('options', $path, $callback); }
public static function any(string $path, callable $callback) { self::match('get|post|put|patch|delete|options', $path, $callback); } static function any(string $path, callable $callback) { self::match('get|post|put|patch|delete|options', $path, $callback); }
public static function middleware(callable|array $middlewares) static function middleware(callable|array $middlewares) {
{
if (!is_array($middlewares)) { if (!is_array($middlewares)) {
$middlewares = [$middlewares]; $middlewares = [$middlewares];
} }
@ -78,8 +65,7 @@ abstract class Route
} }
} }
public static function group(callable $callback) static function group(callable $callback) {
{
self::$groups[] = []; self::$groups[] = [];
$callback(); $callback();
array_pop(self::$groups); array_pop(self::$groups);