UPDATE: Implementing method dispatcher().
This commit is contained in:
parent
1f1e197ea1
commit
c41368046b
|
|
@ -0,0 +1,79 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Core;
|
||||||
|
|
||||||
|
require_once '../app/api/ReportController.php';
|
||||||
|
|
||||||
|
use Nyholm\Psr7\Response;
|
||||||
|
use Psr\Http\Message\ResponseInterface;
|
||||||
|
use Psr\Http\Message\ServerRequestInterface;
|
||||||
|
use App\Controllers\ReportController;
|
||||||
|
|
||||||
|
class Router
|
||||||
|
{
|
||||||
|
protected $routes = [];
|
||||||
|
public function __construct() {}
|
||||||
|
|
||||||
|
public function setRoute($method, $uri, $action)
|
||||||
|
{
|
||||||
|
$this->routes[] = [
|
||||||
|
'method' => $method,
|
||||||
|
'uri' => $uri,
|
||||||
|
'controller' => $action[0],
|
||||||
|
'action' => $action[1]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getRoute()
|
||||||
|
{
|
||||||
|
|
||||||
|
return $this->routes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function checkIfRouteExists($uri, $method, $controller, $action) {}
|
||||||
|
|
||||||
|
public function dispatcher(ServerRequestInterface $request)
|
||||||
|
{
|
||||||
|
$uri = $request->getUri()->getPath();
|
||||||
|
$method = $request->getMethod();
|
||||||
|
|
||||||
|
foreach ($this->routes as $route) {
|
||||||
|
// Converte a URI da rota para um padrão RegEx para capturar parâmetros
|
||||||
|
// Ex: /users/{id} se torna #^/users/([a-zA-Z0-9_]+)$#
|
||||||
|
$pattern = '#^' . preg_replace('/\{([a-zA-Z0-9_]+)\}/', '([a-zA-Z0-9_]+)', $route['uri']) . '$#';
|
||||||
|
|
||||||
|
// Verifica se a URI da requisição corresponde ao padrão da rota
|
||||||
|
if (preg_match($pattern, $uri, $matches)) {
|
||||||
|
|
||||||
|
// Se a URI bateu, agora verifica o método HTTP
|
||||||
|
if ($method !== $route['method']) {
|
||||||
|
// URI correta, método errado -> Erro 405
|
||||||
|
return new Response(405, ['Allow' => $route['method']], 'Method Not Allowed');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Remove o primeiro elemento de $matches, que é a URI completa
|
||||||
|
array_shift($matches);
|
||||||
|
$params = $matches;
|
||||||
|
|
||||||
|
// Instancia o controller e chama a action, passando os parâmetros
|
||||||
|
$controllerClass = $route['controller'];
|
||||||
|
$action = $route['action'];
|
||||||
|
|
||||||
|
// Verifica se a classe do controller existe
|
||||||
|
if (!class_exists($controllerClass)) {
|
||||||
|
return new Response(500, [], 'Controller not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
$controllerInstance = new $controllerClass();
|
||||||
|
|
||||||
|
|
||||||
|
// Chama a action e passa a requisição e os parâmetros
|
||||||
|
// Ex: $meuController->show($request, '123');
|
||||||
|
return $controllerInstance->$action($request, ...$params);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Se o loop terminar e nenhuma rota for encontrada -> Erro 404
|
||||||
|
return new Response(404, [], 'Not Found');
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue