zezeufab Posted September 24 Report Share Posted September 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() .""; } Quote Link to comment Share on other sites More sharing options...
0 Frank K Hosaka Posted September 25 Report Share Posted September 25 (edited) 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?"; } } Edited September 25 by Frank K Hosaka Quote Link to comment Share on other sites More sharing options...
Question
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 to comment
Share on other sites
1 answer to this question
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.