32 lines
904 B
PHP
32 lines
904 B
PHP
<?php
|
|
|
|
namespace App\Core;
|
|
|
|
final class Router
|
|
{
|
|
private array $routes = [];
|
|
|
|
public function add(string $method, string $path, array $handler): void
|
|
{
|
|
$pattern = '#^' . preg_replace('#\{([a-zA-Z_]+)\}#', '(?P<$1>[^/]+)', $path) . '$#';
|
|
$this->routes[] = [$method, $pattern, $handler];
|
|
}
|
|
|
|
public function dispatch(string $method, string $uri): void
|
|
{
|
|
$path = parse_url($uri, PHP_URL_PATH) ?: '/';
|
|
foreach ($this->routes as [$routeMethod, $pattern, $handler]) {
|
|
if ($routeMethod !== $method || !preg_match($pattern, $path, $matches)) {
|
|
continue;
|
|
}
|
|
|
|
$params = array_filter($matches, 'is_string', ARRAY_FILTER_USE_KEY);
|
|
[$class, $action] = $handler;
|
|
(new $class())->$action($params);
|
|
return;
|
|
}
|
|
|
|
Response::error('Ruta no encontrada', 404);
|
|
}
|
|
}
|