diff --git a/app/WillySoft/Route.php b/app/WillySoft/Route.php index d49c596..4ae84b5 100644 --- a/app/WillySoft/Route.php +++ b/app/WillySoft/Route.php @@ -2,24 +2,33 @@ namespace WillySoft; -abstract class Route { - static array $groups = [ +abstract class Route +{ + static array $groups = [ [] ]; - static function match(string $methods, string $path, callable $callback) { + static string $prefix = ''; + + /** + * Check to see if the methods and path satisfy the request. + * and do some magic to retrieve the parameters before calling + * the callback passing those as arguments + */ + static function match(string $methods, string $path, callable $callback) + { if (!in_array($_SERVER['REQUEST_METHOD'], array_map(strtoupper(...), explode('|', $methods)) )) return; - static $cache; - if (!isset($cache)) { - $cache = explode('/', urldecode( + static $request_path_parts_cache; + if (!isset($request_path_parts_cache)) { + $request_path_parts_cache = explode('/', urldecode( strtok($_SERVER['REQUEST_URI'], '?') )); } - $request_path_parts = $cache; - $path_parts = explode('/', $path); + $request_path_parts = $request_path_parts_cache; + $path_parts = explode('/', self::$prefix . $path); $callback_args = []; for ($i=0; $i < count($path_parts); $i++) { if (empty($path_parts[$i])) { @@ -61,7 +70,12 @@ abstract class Route { static function form(string $path, callable $callback) { self::match('get|post', $path, $callback); } static function any(string $path, callable $callback) { self::match('get|post|put|patch|delete|options', $path, $callback); } - static function middleware(callable|array $middlewares) { + /** + * Require that a callable or an array of callables have to run + * if a route is matched within the current or all child groups + */ + static function middleware(callable|array $middlewares) + { if (!is_array($middlewares)) { $middlewares = [$middlewares]; } @@ -72,9 +86,16 @@ abstract class Route { } } - static function group(callable $callback) { + + static function group(string $prefix = '', ?callable $callback = null) + { + if (!str_starts_with($_SERVER['REQUEST_URI'], self::$prefix . $prefix)) { + return; + } + self::$prefix = self::$prefix . $prefix; array_push(self::$groups, []); $callback(); array_pop(self::$groups); + self::$prefix = rtrim(self::$prefix, $prefix); } } \ No newline at end of file