Jump to content
Fórum Script Brasil
  • 0

Problemas com rotas


zezeufab

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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?";
    }


}

 

Edited by Frank K Hosaka
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Forum Statistics

    • Total Topics
      152.2k
    • Total Posts
      652.1k
×
×
  • Create New...