Initial commit
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
// core/Router.php
|
||||
|
||||
class Router {
|
||||
private array $routes = [];
|
||||
|
||||
public function get(string $path, callable|array $handler): void {
|
||||
$this->routes['GET'][$path] = $handler;
|
||||
}
|
||||
|
||||
public function post(string $path, callable|array $handler): void {
|
||||
$this->routes['POST'][$path] = $handler;
|
||||
}
|
||||
|
||||
public function dispatch(): void {
|
||||
$method = $_SERVER['REQUEST_METHOD'];
|
||||
$uri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
|
||||
|
||||
// Strip base path
|
||||
$basePath = parse_url(APP_URL, PHP_URL_PATH);
|
||||
if ($basePath && str_starts_with($uri, $basePath)) {
|
||||
$uri = substr($uri, strlen($basePath));
|
||||
}
|
||||
$uri = '/' . ltrim($uri, '/');
|
||||
if ($uri !== '/' && str_ends_with($uri, '/')) {
|
||||
$uri = rtrim($uri, '/');
|
||||
}
|
||||
|
||||
$routes = $this->routes[$method] ?? [];
|
||||
|
||||
// Two-pass: static routes (no {param}) matched first, dynamic routes second.
|
||||
// This ensures /verifikator/warga/tambah is never swallowed by /verifikator/warga/{id}.
|
||||
$staticRoutes = array_filter($routes, fn($p) => !str_contains($p, '{'), ARRAY_FILTER_USE_KEY);
|
||||
$dynamicRoutes = array_filter($routes, fn($p) => str_contains($p, '{'), ARRAY_FILTER_USE_KEY);
|
||||
|
||||
foreach ([$staticRoutes, $dynamicRoutes] as $group) {
|
||||
foreach ($group as $pattern => $handler) {
|
||||
$regex = $this->buildRegex($pattern);
|
||||
if (preg_match($regex, $uri, $matches)) {
|
||||
array_shift($matches);
|
||||
$params = array_values($matches);
|
||||
|
||||
if (is_array($handler)) {
|
||||
[$controllerName, $action] = $handler;
|
||||
$controller = new $controllerName();
|
||||
$controller->$action(...$params);
|
||||
} else {
|
||||
$handler(...$params);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 404
|
||||
http_response_code(404);
|
||||
require APP_ROOT . '/app/views/public/404.php';
|
||||
}
|
||||
|
||||
private function buildRegex(string $pattern): string {
|
||||
$pattern = preg_replace('/\{(\w+)\}/', '([^/]+)', $pattern);
|
||||
return '#^' . $pattern . '$#';
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user