Publicidad

Como crear rutas en php


Por Alex el 21/03/2022, Comentar el artículo

Comparte este artículo:      




En PHP nativo, sin framework, también podemos crear rutas amigables similares a las que utilizan los frameworks …


La idea es que en lugar de utilizar parámetros en las urls y utilizar múltiples ficheros, de las siguiente forma:

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
En el código PHP lo entenderemos mejor y quedará más claro. Tenemos la siguiente estructura de ficheros:

Árbol de directorios y ficheros del proyecto

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.



Si te ha gustado el artículo compartelo en:      




Añadir un comentarios:

Nombre:
Email: (no se publica el email)




SIGUENOS EN

ARCHIVO

Publicidad

.