From d0760ed95cf8515a51248e6e936bb2b8d043652a Mon Sep 17 00:00:00 2001 From: Maarten Date: Tue, 26 Nov 2024 13:44:53 +0100 Subject: [PATCH] Route collection --- config/routes.php | 10 ++-- src/Routing/Route.php | 32 ++++++++++++ src/Routing/RouteCollection.php | 90 +++++++++++++++++++++++++++++++++ src/Routing/Router.php | 57 +-------------------- 4 files changed, 128 insertions(+), 61 deletions(-) create mode 100644 src/Routing/Route.php create mode 100644 src/Routing/RouteCollection.php diff --git a/config/routes.php b/config/routes.php index 659acde..fd1f717 100644 --- a/config/routes.php +++ b/config/routes.php @@ -3,9 +3,9 @@ use App\Controllers\Api\SubnetController; use App\Controllers\HomeController; use App\Controllers\TestController; -use Core\Routing\Router; +use Core\Routing\Route; -Router::get('/', HomeController::class, 'index'); -Router::post('/api/subnet', SubnetController::class, 'data'); -Router::get('/test/{id}', TestController::class, 'test'); -Router::get('/test/{id}/update', TestController::class, 'test'); \ No newline at end of file +Route::get('/', HomeController::class, 'index'); +Route::post('/api/subnet', SubnetController::class, 'data'); +Route::get('/test/{id}', TestController::class, 'test'); +Route::get('/test/{id}/update', TestController::class, 'test'); \ No newline at end of file diff --git a/src/Routing/Route.php b/src/Routing/Route.php new file mode 100644 index 0000000..86c4a28 --- /dev/null +++ b/src/Routing/Route.php @@ -0,0 +1,32 @@ + $controller, + 'action' => $action, + 'original' => $route, + ]; + } + + /** + * Reveal the treasure trove of routes. + * + * @return array + */ + public static function retrieve(): array + { + return self::$routes; + } + + /** + * Convert a route pattern into a regex for matching requests. + * + * @param string $route + * @return string + */ + protected static function convertToRegex(string $route): string + { + $regex = preg_replace('/\{([a-zA-Z0-9_]+)\}/', '(?P<\1>[a-zA-Z0-9_-]+)', $route); + return '#^' . $regex . '$#'; + } + + /** + * Retrieve a specific route by method and URL. + * + * @param string $method + * @param string $url + * @return array|null + */ + public static function find(string $method, string $url): ?array + { + foreach (self::$routes[$method] ?? [] as $routeRegex => $route) { + if (preg_match($routeRegex, $url, $matches)) { + $route['params'] = array_filter( + $matches, + fn($key) => !is_numeric($key), + ARRAY_FILTER_USE_KEY + ); + return $route; + } + } + + return null; + } + + /** + * Purge all routes from the collection. + * + * @return void + */ + public static function clear(): void + { + self::$routes = []; + } +} \ No newline at end of file diff --git a/src/Routing/Router.php b/src/Routing/Router.php index e88c095..6d90c2a 100644 --- a/src/Routing/Router.php +++ b/src/Routing/Router.php @@ -6,61 +6,6 @@ use Core\Http\Request; class Router { - /** - * List of routes - * - * @var array - */ - protected static array $routes = []; - - /** - * Add GET route - * - * @param string $route - * @param string $controller - * @param string $action - * @return void - */ - public static function get(string $route, string $controller, string $action): void - { - self::register($route, $controller, $action, "GET"); - } - - /** - * Add POST route - * - * @param string $route - * @param string $controller - * @param string $action - * @return void - */ - public static function post(string $route, string $controller, string $action): void - { - self::register($route, $controller, $action, "POST"); - } - - /** - * Register route - * - * @param string $route - * @param string $controller - * @param string $action - * @param string $method - * @return void - */ - public static function register(string $route, string $controller, string $action, string $method): void - { - // Convert route with parameters into regex - $routeRegex = preg_replace('/\{([a-zA-Z0-9_]+)\}/', '(?P<\1>[a-zA-Z0-9_-]+)', $route); - $routeRegex = '#^' . $routeRegex . '$#'; - - self::$routes[$method][$routeRegex] = [ - 'controller' => $controller, - 'action' => $action, - 'original' => $route, - ]; - } - /** * Dispatch router and run application * @@ -72,6 +17,6 @@ class Router $request = new Request($_POST + $_FILES); // Dispatch router - RouteDispatcher::dispatch($request, self::$routes); + RouteDispatcher::dispatch($request, RouteCollection::retrieve()); } } \ No newline at end of file