http://dominio.com/index.php?id=9999&cat=azul&code=jqhjkqh4qn
http://dominio.com/seccion.php?id=9999&cat=azul&code=jqhjkqh4qn
Utilizamos rutas amigables con un único punto de entrada, index.php, de la siguiente forma:
http://dominio.com/tags/cocina
http://dominio.com/listados/armarios/1/2/3
De esta forma es más fácil de leer, de interpretar y de indexar, son url amigables.
En el código PHP dividiremos la url en dominio, controlador, método y parámetros.
- dominio: dominio.com
- controlador: tags / listados
- método: cocina / armarios
- parámetros: todo lo que viene después separado por / es un parámetro diferente
Fichero index.php
# Incluimos la clase que nos hara el rotuing
require_once "RoutingManager.php";
# Instanciamos la clase routing para extraer la ruta de la url.
$routes = new RoutingManager();
$return = $routes->init();
# Escribimos por pantalla el resultado
print_r( $return);
En este fichero index.php incluimos el fichero de routing y lo instanciamos, dentro de la clase RoutingManager realizamos todo el proceso de routing.
Fichero RoutingManager.php
# Ejemplo de URL
#
# http://rutas.local/home/listados/param1/param2/param3
#
# donde: home es el controlador a cargar, en este ejemplo Home.php
# listados es el metodo
# param1 ... param3 son los parametros que le pasamos al metodo
#
#
Class RoutingManager
{
public function init()
{
# No hay parametros, con lo que no hay controlador ni metodo
# Y utilizamos uno por defecto.
if ( $_SERVER['REQUEST_URI'] == '/')
{
$controller = "Home";
$method = "init";
}
else
{
# Recogemos la url para saber que controlador y metodo que nos estan pidiendo
# y lo ponemos en un array
$request_uri = explode ("/", $_SERVER['REQUEST_URI']);
}
# Obtenemos el controlador que sera el primer parametro despues del dominio
if ( isset( $request_uri[1]))
{
$controller = ucfirst( $request_uri[1]);
}
# Miramos si viene le metodo, que es el sugundo parametro de la url
# si no viniera podriamos poner uno por defecto
if ( isset( $request_uri[2]))
{
$method = $request_uri[2];
}
else
{
$method = "init";
}
# Ahora recogemos los parametros, que es todo lo que venga despues del metodo
# y por si vienen multiples parametros los ponemos en un array
#
$params = [];
if ( isset( $request_uri[3]))
{
for ( $i = 3; $i < count($request_uri); $i++)
{
$params[] = $request_uri[$i];
}
}
# Cargamos la clase y el metodo que nos piden
$controller_file = dirname(__FILE__)."/controllers/".$controller.".php";
# Si el fichero del controlador existe, lo cargamos y lo instanciamos.
if ( file_exists( $controller_file))
{
require_once dirname(__FILE__)."/controllers/BaseController.php";
require_once $controller_file;
$class_controller = new $controller();
# Si el metodo existe lo instanciamos y ejecutamos lo que tiene que hacer
# pasandole los parametros que necesite.
if ( method_exists( $class_controller, $method))
{
$return = $class_controller->{$method} ( $params);
}
else
{
$return = "Method not found";
}
}
else
{
$return = "file not exist";
}
# Devolvemos el resultado.
return( $return);
}
}
En esta clase procesamos las rutas y cargamos la clase y método que se tiene que ejecutar. Esta muy comentado y es fácil de ir leyendo los comentarios
Los ficheros que hay dentro del directorio controllers son las clases que se van cargando según los parámetros de la url: Home.php, User.php, BaseController.php, es un controlador común del que derivan el resto de clases para poder poner métodos comunes.
Veamos un par de ejemplos sobre este código:
- http://dominio.com/users/registro/param1/param2/param3
users es el controlador Users.php
registro es el método
param1/param2/param3 son los diferentes parámetros, en total 3 parametros - http://dominio.com/users/login/param1/
users es el controlador Users.php
login es el método
param1 este método solo tiene un parámetro. - http://dominio.com/home/listados/
home es el controlador Home.php
listados es el método
Este método no tiene parámetros.
Y por último necesitaremos el mod_rewrite activado en apache2 o nginx y el fichero .htaccess con el siguiente contenido:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,QSA]
El código del artículo esta en https://github.com/depruebas/rutas-php/tree/master
Y esto es todo, y feliz programming
Saludos
Alex.
También puede interesarte:
Configurar Laravel Sail para utilizar un MySql externo existente |
||