abschluss
This commit is contained in:
80
app/Core/Router.php
Normal file
80
app/Core/Router.php
Normal file
@ -0,0 +1,80 @@
|
||||
<?php
|
||||
namespace Blog\Core;
|
||||
|
||||
use Blog\Middleware\MiddlewareInterface;
|
||||
use Blog\Http\Request;
|
||||
use Blog\Http\Response;
|
||||
|
||||
/**
|
||||
* Router-Klasse für das Routing von HTTP-Anfragen.
|
||||
*/
|
||||
class Router {
|
||||
/**
|
||||
* @var array Liste der registrierten Routen.
|
||||
*/
|
||||
private array $routes = [];
|
||||
|
||||
/**
|
||||
* Fügt eine neue Route hinzu.
|
||||
*
|
||||
* @param string $method HTTP-Methode (z.B. GET, POST).
|
||||
* @param string $path Pfad der Route, kann Platzhalter enthalten.
|
||||
* @param callable $handler Handler-Funktion für die Route.
|
||||
* @param array $middlewares Liste der Middlewares für die Route.
|
||||
* @return void
|
||||
*/
|
||||
public function addRoute(string $method, string $path, callable $handler, array $middlewares = []): void {
|
||||
$path = preg_replace('/{(\w+)}/', '(?P<$1>[^/]+)', $path);
|
||||
$this->routes[] = compact("method", "path", "handler", "middlewares");
|
||||
}
|
||||
|
||||
/**
|
||||
* Verarbeitet eine eingehende HTTP-Anfrage und sucht nach einer passenden Route.
|
||||
*
|
||||
* @param Request $req Die eingehende HTTP-Anfrage.
|
||||
* @param Response $res Die HTTP-Antwort.
|
||||
* @return void
|
||||
*/
|
||||
public function dispatch(Request $req, Response $res): void {
|
||||
$method = $req->getMethod();
|
||||
$uri = $req->getPath();
|
||||
|
||||
foreach($this->routes as $route) {
|
||||
if($route['method'] === $method && preg_match("~^" . $route['path'] . "$~", $uri, $matches)) {
|
||||
array_shift($matches);
|
||||
$params = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY);
|
||||
if(!$this->handleMiddlewares($route['middlewares'], $req, $res))
|
||||
return;
|
||||
call_user_func_array($route['handler'], array_merge([ $req, $res ], $params));
|
||||
$res->send();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$res
|
||||
->setStatus(404)
|
||||
->getBody()
|
||||
->write("404 - Not Found")
|
||||
->send();
|
||||
}
|
||||
|
||||
/**
|
||||
* Führt die definierten Middlewares für eine Anfrage aus.
|
||||
*
|
||||
* @param array $middlewares Liste der Middlewares.
|
||||
* @param Request $req Die eingehende HTTP-Anfrage.
|
||||
* @param Response $res Die HTTP-Antwort.
|
||||
* @return bool Gibt true zurück, wenn alle Middlewares erfolgreich ausgeführt wurden, andernfalls false.
|
||||
*/
|
||||
private function handleMiddlewares(array $middlewares, Request $req, Response $res): bool {
|
||||
foreach($middlewares as $middleware) {
|
||||
$middlewareInstance = is_string($middleware) ? new $middleware() : $middleware;
|
||||
if($middlewareInstance instanceof MiddlewareInterface) {
|
||||
if(!$middlewareInstance->handle($req, $res)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user