zezeufab Postado Setembro 24 Denunciar Share Postado Setembro 24 Boa tarde. Estou iniciando em php, mas logo de inicio, estou com problema que não consigo resolver. Criar um sistema de rotas da seguinte forma: arquivo de rotas function load($controller,$action) { try { // se controller existe $controllerNamespace = "app\\controllers\\{$controller}"; if (!class_exists($controllerNamespace)) { throw new Exception("O controller {$controller} não existe"); } $controllerInstance = new $controllerNamespace(); if (!method_exists($controllerInstance, $action)) { throw new Exception( "O método {$action} não existe no controller {$controller}" ); } $controllerInstance->$action(); } catch (Exception $e) { echo $e->getMessage(); } } $router=[ "GET" => [ "/" => fn () => load("HomeController", "index"), "/info" => fn () => load("InfoController", "info"), ], "POST" => [ //"/info" => fn () => load("InfoController", "info"), ], ]; se eu colocar no navegador localhost, da tudo certinho, mas se eu colocar localhost/info sempre retorna Not Found The requested URL was not found on this server. arquivo index require 'vendor/autoload.php'; require 'app/rotas.php'; try{ $uri=parse_url($_SERVER["REQUEST_URI"])['path']; $request=$_SERVER['REQUEST_METHOD']; if(!isset($router[$request])) { throw new Exception('A rota não existe0'); } if(!array_key_exists($uri,$router[$request])) { throw new Exception('A rota não existe1'); } $controller=$router[$request][$uri]; $controller(); }catch(Exception $e) { echo "". $e->getMessage() .""; } Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Frank K Hosaka Postado Setembro 25 Denunciar Share Postado Setembro 25 (editado) Eu usei a pasta a Astudy para testar o seu código, veja se o seu arquivo .htaccess (que fica na raiz do projeto como o index.php) está mais ou menos assim: # Ativação do RewriteEngine que nos permite gerenciar as rotas RewriteEngine On # Definição da rota principal RewriteBase / # Se o diretório ou arquivos digitados na URL não existirem, seguir a RewriteRule RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f # Rewrite Rule, redirecionar todas as requests para o index.php RewriteRule ^(.+)$ /Astudy/index.php [QSA,L] No index.php utilizei um autload que você não listou, e também modifiquei a rotina original <?php spl_autoload_register(function ($class) { $file = __DIR__ . '/app/controllers/' . $class . '.php'; if (file_exists($file)) { require_once $file; } }); require 'rotas.php'; try{ $pos=strrpos($_SERVER['REQUEST_URI'],'/'); $uri=substr($_SERVER['REQUEST_URI'],$pos); $request=$_SERVER['REQUEST_METHOD']; if(!isset($router[$request])) { throw new Exception('A rota não existe0'); } if(!array_key_exists($uri,$router[$request])) { throw new Exception('A rota não existe1'); } $controller=$router[$request][$uri]; $controller(); }catch(Exception $e) { echo "". $e->getMessage() .""; } E aqui rotas.php <?php function load($controller,$action) { try { // se controller existe if (!class_exists($controller)) { throw new Exception("O controller {$controller} não existe"); } $controllerInstance = new $controller(); if (!method_exists($controllerInstance, $action)) { throw new Exception( "O método {$action} não existe no controller {$controller}" ); } $controllerInstance->$action(); } catch (Exception $e) { echo $e->getMessage(); } } $router=[ "GET" => [ "/" => fn () => load("HomeController", "index"), "/info" => fn () => load("InfoController", "info"), ], "POST" => [ //"/info" => fn () => load("InfoController", "info"), ], ]; Espero que tenha ajudado. Eu gostei desse código, ele se aproxima bastante do modelo Laravel. Eu tenho o PHP 8.2, um autoload e um roteador bem safado que dispensa o uso de pastas, coloco tudo no diretório raiz, não uso o arquivo .htaccess e não preciso atualizar o arquivo rotas.php (aliás, eu nem tenho esse arquivo) toda vez que eu criar uma tarefa nova, aqui está ele, para usá-lo, eu uso a sintaxe ?classe.metodo.argumento: arquivo index.php <?php spl_autoload_register(fn ($class) => require str_replace('\\', DIRECTORY_SEPARATOR, strtolower($class)) . '.php'); $rota='login_login'; if($_GET) { if(strpos(key($_GET),"_")==0) { exit; } $rota=isset($_GET) ? key($_GET) : $rota; } $segmentos=explode('_',$rota); $nomeControle=$segmentos[0] ?? 'login'; $metodo=$segmentos[1] ?? 'login'; $parametro=$segmentos[2] ?? null; $controle=new $nomeControle(); $controle->$metodo($parametro); arquivo login.php <?php class Login { function login() { ?> olá mundo! <br> <form method=post action=?login.maisExemplo> <input type=submit value="Me clique"> </form> <?php } function maisExemplo() { echo "E aí, você gostou?"; } } Editado Setembro 25 por Frank K Hosaka Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
zezeufab
Boa tarde.
Estou iniciando em php, mas logo de inicio, estou com problema que não consigo resolver.
Criar um sistema de rotas da seguinte forma:
arquivo de rotas
se eu colocar no navegador localhost, da tudo certinho, mas se eu colocar localhost/info sempre retorna
Not Found
The requested URL was not found on this server.
arquivo index
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.