diff options
Diffstat (limited to 'App/Router.php')
| -rw-r--r-- | App/Router.php | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/App/Router.php b/App/Router.php new file mode 100644 index 0000000..42fd3e1 --- /dev/null +++ b/App/Router.php @@ -0,0 +1,48 @@ +<?php +namespace App; + +class Router { + private array $config; + private string $routesDir; + private array $statusHandlers = []; + + function __construct(string $routesDir, array $config) { + $this->routesDir = $routesDir; + $this->config = $config; + } + + function registerStatusHandler(int $status, callable $handler) { + $this->statusHandlers[$status] = $handler; + } + + private function dealWithError(int $status, string $path) { + http_response_code($status); + if (isset($this->statusHandlers[$status])) { + $this->statusHandlers[$status]($path); + } else { + echo '<p>' . $status . ' for ' . htmlspecialchars($path) . '</p>'; + } + } + + function dispatch(string $path) { + if (str_contains($path, '..')) { + $this->dealWithError(404, $path); + return; + } + + if (file_exists($this->routesDir . $path . '.php')) { + require_once $this->routesDir . $path . '.php'; + } elseif (file_exists($this->routesDir . $path . 'index.php')) { + require_once $this->routesDir . $path . 'index.php'; + } else { + $this->dealWithError(404, $path); + return; + } + + if (function_exists($_SERVER['REQUEST_METHOD'])) { + $_SERVER['REQUEST_METHOD']($this->config); + } else { + $this->dealWithError(405, $path); + } + } +} |
