Ir para conteúdo
Fórum Script Brasil
  • 0

Problemas com rotas


zezeufab

Pergunta

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() ."";
}
Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0

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 por Frank K Hosaka
Link para o comentário
Compartilhar em outros sites

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...