diff --git a/Route.php b/Route.php index 56c02bd..61c0613 100644 --- a/Route.php +++ b/Route.php @@ -5,15 +5,36 @@ namespace WillySoft; use \Exception; use \InvalidArgumentException; +/** + * Minimalistic Web Application Router + */ abstract class Route { + /** + * Used for group prefixes + */ static string $prefix = ''; + + /** + * Stores the middleware callbacks in their respective group; each nesting represented by index + */ static array $groups = [ - [] + // Default initialized group where all middlewares are added to if they are not inside any other groups + [ + //fn() => print('this could be a middleware, and it would print on every single route!') + ], + //[ + // fn() => print('this is what it would look like if a new group was created and a middleware was + // added inside of it!') + //] ]; - private static function getRequestPath(): string + /** + * Get request path relative to the entrypoint of the application + */ + static function getRelativeRequestPath(): string { + // try to save a negligible amount of performance by caching the computated result static $request_url_path; if (isset($request_url_path)) { @@ -29,14 +50,17 @@ abstract class Route return $request_url_path; } - static function match(string $methods, string $url_path, callable $callback) + /** + * Run all middlewares then callback if supplied arguments correspond with the request + */ + static function match(string $methods, string $url_path, callable $callback): void { if (!in_array( $_SERVER['REQUEST_METHOD'], array_map(strtoupper(...), explode('|', $methods)) )) return; - $request_url_path_parts = explode('/', self::getRequestPath()); + $request_url_path_parts = explode('/', self::getRelativeRequestPath()); $url_path_parts = explode('/', self::$prefix . $url_path); $callback_args = []; @@ -79,38 +103,56 @@ abstract class Route die(); } - static function get(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function get(string $url_path, callable $callback): void {self::match('get', $url_path, $callback);} - static function post(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function post(string $url_path, callable $callback): void {self::match('post', $url_path, $callback);} - static function put(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function put(string $url_path, callable $callback): void {self::match('put', $url_path, $callback);} - static function patch(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function patch(string $url_path, callable $callback): void {self::match('patch', $url_path, $callback);} - static function delete(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function delete(string $url_path, callable $callback): void {self::match('delete', $url_path, $callback);} - static function options(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function options(string $url_path, callable $callback): void {self::match('options', $url_path, $callback);} - static function form(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function form(string $url_path, callable $callback): void {self::match('get|post', $url_path, $callback);} - static function any(string $url_path, callable $callback) + // Shorthand for self::match(...) + static function any(string $url_path, callable $callback): void {self::match('get|post|put|patch|delete|options', $url_path, $callback);} - static function use(callable $middleware) + /** + * Adds Adds middleware to its respective group + */ + static function use(callable $middleware): void { array_push( self::$groups[array_key_last(self::$groups)], $middleware ); } - - static function group(string $prefix = '', ?callable $callback = null) + + /** + * Create new route group + * + * @param string $prefix Optional prefix can be supplied; the group is ignored if getRelativeRequestPath + * does not correspond with the supplied value. + * @param callable $callback Required; the insides of the group + */ + static function group(string $prefix = '', ?callable $callback = null): void { if ($callback === null) { - throw new InvalidArgumentException('Argument $callback must be of type callable.'); + throw new InvalidArgumentException('Argument callback must be of type callable.'); } if (!str_starts_with( - self::getRequestPath(), + self::getRelativeRequestPath(), self::$prefix . $prefix )) return; self::$prefix = self::$prefix . $prefix;