Skip to content

Instantly share code, notes, and snippets.

@shinigamicorei7
Last active April 11, 2024 22:50
Show Gist options
  • Save shinigamicorei7/8cccbcfc9eb6f234d8d8 to your computer and use it in GitHub Desktop.
Save shinigamicorei7/8cccbcfc9eb6f234d8d8 to your computer and use it in GitHub Desktop.
Routing Basico en PHP

Una de las necesidades más comunes en el desarrollo de Sitios profesionales es implementar URLs amigables, así convertimos algo como /index.php?articulo=1 por algo más cómodo y agradable a la vista del usuario: /blog/introduccion.htm

Para lograr esto existen muchos paquetes, que son altamente recomendables, como:.

En esta clase no buscamos superar a nadie, simplemente quiero demostrarles que puede ser sencillo hasta cierto nivel.

###.htaccess

RewriteEngine On

RewriteCond ${REQUEST_FILENAME} !-f
RewriteCond ${REQUEST_FILENAME} !-d

RewriteRule $(.+)^ index.php?uri=$1 [QSA,L]

###Routing.php

<?php

class Router 
{

    private $_uri = array();
    private $_action = array();

    public function add($uri, $action = null) 
    {
        $this->_uri[] = '/' . trim($uri, '/');

        if ($action != null) 
        {
            $this->_action[] = $action;
        }
    }

    public function run() 
    {
        $uriGet = isset($_GET['uri']) ? '/' . $_GET['uri'] : '/';
        
        foreach ($this->_uri as $key => $value) 
        {
            if (preg_match("#^$value$#", $uriGet)) 
            {
                $action = $this->_action[$key];
                $this->runAction($action);
            }
        }
    }

    private function runAction($action) 
    {
        if($action instanceof \Closure)
        {
            $action();
        }  
        else 
        {
            $params = explode('@', $action);
            $obj = new $params[0];
            $obj->{$params[1]}();
        }
    }

}
?>

###index.php

<?php

require 'Routing.php';
require 'Control/HomeController.php';

$router = new Routing();

$router->add('/',function(){
  echo "Hola Mundo - Esta es una ruta simple";
});

//de esta manera llamamos una funcion dentro de una clase
//class @ method
$router->add('/home','HomeController@showHome');

$router->add('/about','HomeController@showAbout');

$router->run();

?>

###HomeController.php

<?php

class HomeController {
  
  //HomeController@showHome
  public function showHome(){
    return "Hola mundo - Asi llamo una funcion dentro de un controllador";
  }
  
  //HomeController@showAbout
  public function showAbout(){
    return "Hola mundo - Asi llamo una funcion dentro de un controllador";
  }  

}

?>

Que Viva el Software Libre :D

@juanigauna
Copy link

Está muy bueno.
Yo estoy tratando de entender más o menos algunas funciones de laravel, solo de curiosidad.

@agsardon
Copy link

agsardon commented Jun 21, 2022

Hola:

He tenido que hacer debug:

En el método run de la clase Router he comentado la linea:
//$uriGet = isset($_GET['uri']) ? '/' . $_GET['uri'] : '/';
Y la he sustituido por:
$uriGet = isset($_SERVER['REQUEST_URI']) ? $_SERVER['REQUEST_URI'] : '/';
Además de eso a la clase la llamas Router pero la intentas instanciar con el nombre Routing. Al fichero le llamas Routing.php.

Corregidos esos fallos funciona OK.

@coddingnoob
Copy link

muchas gracias

@jlaya
Copy link

jlaya commented Apr 16, 2023

Hola, saludos

en este caso para hacer peticiones POST como lo elaboro para que funcione?

tomando como ejemplo el router

$router->add('/login','LoginController@login');

@Zekard92
Copy link

Hola,

noté que estas utilizanso MD para los encabezados de tercer nivel, dejando el título pegado a los gatos ("#").
para que estos se denoten correctamente se tiene que mantener un espacio entre estos
###.htaccess -> ### .htaccess
y la diferencia es la siguiente:

.htaccess

Saludos.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment