Route collection
This commit is contained in:
parent
e8d8e0e95b
commit
d0760ed95c
4 changed files with 128 additions and 61 deletions
|
@ -3,9 +3,9 @@
|
||||||
use App\Controllers\Api\SubnetController;
|
use App\Controllers\Api\SubnetController;
|
||||||
use App\Controllers\HomeController;
|
use App\Controllers\HomeController;
|
||||||
use App\Controllers\TestController;
|
use App\Controllers\TestController;
|
||||||
use Core\Routing\Router;
|
use Core\Routing\Route;
|
||||||
|
|
||||||
Router::get('/', HomeController::class, 'index');
|
Route::get('/', HomeController::class, 'index');
|
||||||
Router::post('/api/subnet', SubnetController::class, 'data');
|
Route::post('/api/subnet', SubnetController::class, 'data');
|
||||||
Router::get('/test/{id}', TestController::class, 'test');
|
Route::get('/test/{id}', TestController::class, 'test');
|
||||||
Router::get('/test/{id}/update', TestController::class, 'test');
|
Route::get('/test/{id}/update', TestController::class, 'test');
|
32
src/Routing/Route.php
Normal file
32
src/Routing/Route.php
Normal file
|
@ -0,0 +1,32 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Core\Routing;
|
||||||
|
|
||||||
|
class Route
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
{
|
||||||
|
RouteCollection::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
|
||||||
|
{
|
||||||
|
RouteCollection::register($route, $controller, $action, 'POST');
|
||||||
|
}
|
||||||
|
}
|
90
src/Routing/RouteCollection.php
Normal file
90
src/Routing/RouteCollection.php
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Core\Routing;
|
||||||
|
|
||||||
|
class RouteCollection
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* A majestic vault of all defined routes.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
protected static array $routes = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a route to the sacred collection.
|
||||||
|
*
|
||||||
|
* @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
|
||||||
|
{
|
||||||
|
// Transform human-readable route syntax into regex.
|
||||||
|
$routeRegex = self::convertToRegex($route);
|
||||||
|
|
||||||
|
// Store the route in the sacred collection
|
||||||
|
self::$routes[$method][$routeRegex] = [
|
||||||
|
'controller' => $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 = [];
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,61 +6,6 @@ use Core\Http\Request;
|
||||||
|
|
||||||
class Router
|
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
|
* Dispatch router and run application
|
||||||
*
|
*
|
||||||
|
@ -72,6 +17,6 @@ class Router
|
||||||
$request = new Request($_POST + $_FILES);
|
$request = new Request($_POST + $_FILES);
|
||||||
|
|
||||||
// Dispatch router
|
// Dispatch router
|
||||||
RouteDispatcher::dispatch($request, self::$routes);
|
RouteDispatcher::dispatch($request, RouteCollection::retrieve());
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Add table
Add a link
Reference in a new issue