routes[] = [ 'method' => $method, 'uri' => $uri, 'controller' => $action[0], 'action' => $action[1] ]; } public function getRoute() { return $this->routes; } public function getQueryParams(ServerRequestInterface $serverRequest) { return $serverRequest->getQueryParams(); } public function checkIfRouteExists($uri, $method, $controller, $action) {} public function dispatcher(ServerRequestInterface $request) { $uri = $request->getUri()->getPath(); $method = $request->getMethod(); $queryParams = $this->getQueryParams($request); 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'], 'Content-Type' => 'application/json'], json_encode(['error' => 'Recurso não foi encontrado'])); } // 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, ['Content-Type' => 'application/json', 'Accept' => 'application/json'], json_encode(['error' => 'Recurso não foi encontrado'])); } $controllerInstance = $this->container->get($controllerClass); if (empty($queryParams)) { return new Response(403, ['Content-Type' => 'application/json', 'Accept' => 'application/json'], json_encode(['error' => 'O parâmetro de data não foi enviado.'])); } // Chama a action e passa a requisição e os parâmetros // Ex: $meuController->show($request, '123'); return $controllerInstance->$action($request, $queryParams); } } // Se o loop terminar e nenhuma rota for encontrada -> Erro 404 return new Response(404, ['Content-Type' => 'application/json'], json_encode(['error' => 'Rota inexistente'])); } }