mirror of
https://github.com/mivodev/mivo.git
synced 2026-01-26 05:25:42 +07:00
Initial Release v1.0.0: Full feature set with Docker automation, Nginx/Alpine stack
This commit is contained in:
67
app/Core/Router.php
Normal file
67
app/Core/Router.php
Normal file
@@ -0,0 +1,67 @@
|
||||
<?php
|
||||
|
||||
namespace App\Core;
|
||||
|
||||
class Router {
|
||||
protected $routes = [];
|
||||
|
||||
public function get($path, $callback) {
|
||||
$this->routes['GET'][$path] = $callback;
|
||||
}
|
||||
|
||||
public function post($path, $callback) {
|
||||
$this->routes['POST'][$path] = $callback;
|
||||
}
|
||||
|
||||
public function dispatch($uri, $method) {
|
||||
$path = parse_url($uri, PHP_URL_PATH);
|
||||
|
||||
// Handle subdirectory
|
||||
$scriptName = dirname($_SERVER['SCRIPT_NAME']);
|
||||
if (strpos($path, $scriptName) === 0) {
|
||||
$path = substr($path, strlen($scriptName));
|
||||
}
|
||||
$path = '/' . trim($path, '/');
|
||||
|
||||
// Global Install Check: Redirect if database is missing
|
||||
$dbPath = ROOT . '/app/Database/database.sqlite';
|
||||
if (!file_exists($dbPath)) {
|
||||
// Whitelist /install route and assets to prevent infinite loop
|
||||
if ($path !== '/install' && strpos($path, '/assets/') !== 0) {
|
||||
header('Location: /install');
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
// Check exact match first
|
||||
if (isset($this->routes[$method][$path])) {
|
||||
$callback = $this->routes[$method][$path];
|
||||
return $this->invokeCallback($callback);
|
||||
}
|
||||
|
||||
// Check dynamic routes
|
||||
foreach ($this->routes[$method] as $route => $callback) {
|
||||
// Convert route syntax to regex
|
||||
// e.g. /dashboard/{session} -> #^/dashboard/([^/]+)$#
|
||||
$pattern = preg_replace('/\{([a-zA-Z0-9_]+)\}/', '([^/]+)', $route);
|
||||
$pattern = "#^" . $pattern . "$#";
|
||||
|
||||
if (preg_match($pattern, $path, $matches)) {
|
||||
array_shift($matches); // Remove full match
|
||||
$matches = array_map('urldecode', $matches);
|
||||
return $this->invokeCallback($callback, $matches);
|
||||
}
|
||||
}
|
||||
|
||||
\App\Helpers\ErrorHelper::show(404);
|
||||
}
|
||||
|
||||
protected function invokeCallback($callback, $params = []) {
|
||||
if (is_array($callback)) {
|
||||
$controller = new $callback[0]();
|
||||
$method = $callback[1];
|
||||
return call_user_func_array([$controller, $method], $params);
|
||||
}
|
||||
return call_user_func_array($callback, $params);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user