diff --git a/core/Router.php b/core/Router.php new file mode 100644 index 0000000..e516b7b --- /dev/null +++ b/core/Router.php @@ -0,0 +1,79 @@ +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'); + } +}