Enrutado personalizado de URLs en CodeIgniter

  • Por
  • PHP
Las funciones de enrutado definidas en CodeIgniter se pueden personalizar de manera que se creen nuevas reglas específicas en las aplicaciones.
CodeIgniter tiene un sistema bastante práctico por el cual las URL de las aplicaciones web se enrutan a controladores y métodos dentro de ellos. Es un sistema a través del cual conseguimos que URLs amigables para buscadores se ejecuten en pedazos de código a los que además enviamos todo tipo de parámetros.

A lo largo del Manual de CodeIgniter, estas funciones de enrutado ya las hemos estado utilizando de manera intensiva y estaban explicadas en el artículo URLs en CodeIgniter. En el presente texto vamos a explicar cómo podemos sobreescribir ese enrutado predeterminado, creando URLs mucho más personalizadas, a las que asignamos diferentes recursos para su ejecución.

De manera predeterminada, el enrutado de CodeIgniter hace que el primer elemento después del nombre del dominio sea la clase o controlador que tiene que gestionarlo. El segundo elemento de la URL sería el método dentro de ese controlador y el tercero, y siguientes, serían los parámetros enviados al método que ejecutaría esa ruta. Eso se puede ver en el siguiente esquema de URL:

http://midominio.com/controlador/metodo/parametro

Pero este modelo de trabajo, que puede ser óptimo para la mayoría de los casos, puede que no lo sea tanto para muchos otros. Afortunadamente, los desarrolladores de aplicaciones de CodeIgniter disponen de unos mecanismos para sobreescribir esas rutas predeterminadas y hacelas que se adapten a sus necesidades, para crear rutas diferentes, como podrían ser:

http://midominio.com/productos/21/
http://midominio.com/productos/13/
http://midominio.com/productos/9/

De manera predeterminada el segundo segmento de la URL correspondería con el nombre del método que ejecutaría la página, pero en esos ejemplos, como se puede ver, estaríamos pasando el identificador de un producto, que probablemente nos gustaría que se enviara como parámetro a un método de controlador.

Creando tus propias reglas de enrutado

Existe un archivo donde podemos generar todo tipo de reglas para conseguir un enrutado de URIs distinto del predeterminado. Ese archivo lo podemos encontrar en el directorio de los archivos de configuración:

system/application/config/routes.php

Allí podremos definir un array llamado $route donde colocaremos todas las reglas de enrutado que queremos crear de manera específica en nuestra aplicación web CodeIgniter.

Si abrimos el mencionado archivo podremos ver que ya hay dos valores de enrutado definidos en el array $route.

$route['default_controller'] = "welcome";
$route['scaffolding_trigger'] = "";

Esos dos valores de enrutamiento son propios de CodeIgniter y están reservados para cualquier otro uso. Nosotros podemos cambiar los valores predeterminados de enrutamiento para esas variables, pero no podemos crear rutas de nuestra aplicación utilizándolos. Además estas dos rutas predeterminadas deben aparecer antes de cualquier otra ruta que definamos posteriormente en el archivo routes.php.

Nota: El primero de ellos, default_controller, sirve para definir el controlador por defecto que se ejecutaría en caso que no se indique ninguna ruta en la URL (en la raíz del dominio). En la configuración que viene en la instalación básica de CodeIgniter, si no se específica nada en la URL, se abre el controlador "welcome", pero ese controlador predeterminado lo podemos cambiar según nuestras necesidades.
Al hablar de controladores ya se comentó qué era el controlador por defecto y cómo podemos cambiarlo. Ahora ya sabemos que ese cambio de controlador predeterminado en realidad no era más que la definición de una regla de enrutado en CodeIgniter.

Entonces, para crear nuestras propias reglas, se trataría simplemente de asignar nuevos valores al array asociativo $route y para ello tenemos que atender a la siguiente sintaxis:

$route['de_donde_vienes'] = 'a_donde_vas';

Como se puede ver, en las rutas tenemos dos partes:

  • En el índice del array asociativo, 'de_donde_vienes', colocamos un patrón que debe coincidir para que se produzca un enrutamiento.
  • En el valor asignado a ese índice del array, 'a_donde_vas', colocamos la ruta a la que estamos enviando el flujo de ejecución de CodeIgniter.
Ahora veamos un ejemplo de enrutamiento real:

$route['desarrolloweb'] = "empresa/tecnologia/5";

Esto quiere decir que, si CodeIgniter se encuentra "desarrolloweb" en el primer segmento de la URL (después del nombre del dominio), se redireccionará el flujo de la aplicación para el controlador "empresa", el método "tecnologia" y pasándole como parámetro el dígito 5.

Claro que estas rutas se podrán definir por medio de patrones, de varias maneras, para hacerlas más potentes. Para ello, dichos patrones de enrutamiento, que sirven para definir las rutas 'de_donde_vienes', pueden incluir comodines o expresiones regulares.

Nota: De manera general, al definir las reglas de enrutado no se deben colocar las barras al principio ni al final de la ruta. Por ejemplo, no uses "/empresas/tecnologia/1/", sino "empresas/tecnologia/1".

Definir rutas con comodines

Los comodines nos sirven para definir patrones sencillos de enrutamiento. Existen dos dos tipos de comodines que podemos utilizar:

(:num)
Este comodín sirve para cualquier cadena que contenga solamente dígitos numéricos.

(:any)
Este comodín sirve para cualquier cadena, con cualquier carácter.

Para ver cómo utilizar estos comodines en la generación de reglas de enrutamiento, podemos observar el siguiente ejemplo:

$route['producto/(:any)'] = "productos/busqueda";

En este ejemplo, una URL que tenga la palabra producto en el primer segmento y en el segundo segmento cualquier conjunto de caracteres, se enrutará por el controlador productos y el método búsqueda.

$route['cliente/(:num)'] = "empresa/muestra_cliente/$1";

En este segundo ejemplo, si el sistema de enrutado de CodeIgniter detecta que en el primer segmento de la URL está la palabra "cliente" y en el segundo segmento hay un número, la aplicación enrutaría esta llamada a través del controlador "empresa" y el método "cliente". Además, pasaría ese número, del segundo segmento de la URL de origen, como parámetro al método muestra_cliente.

Crear las reglas de enrutamiento con expresiones regulares

Toda la potencia de las expresiones regulares la podemos aplicar a CodeIgniter para crear reglas de enrutamiento tan complejas como deseemos.

$route['manuales/([0-9]+)'] = "manuales/muestra/$1";

Si detectamos en la primera parte la palabra manuales y en el segundo segmento un conjunto de dígitos numéricos, se enrutaría a través del controlador manuales, el método muestra, con el parámetro indicado como dígitos numéricos.

$route['espana/([a-z_-]+)/([a-z_-]+)'] = "localidad/$1/$2";

Esta regla de enrutamiento, un poco más compleja, serviría para detectar la palabra "espana" en el primer segmento y luego dos segmentos adicionales, con sendas expresiones regulares que aceptarían letras de la "a" a la "z" con el guión bajo o medio, repetidas una o más veces. Las enrutaría a través del controlador "localidad" y luego, el método especificado en la primera expresión y el parámetro indicado en la segunda expresión regular.

Nota: en el caso de usar "backreferences" de las expresiones regulares, se debe usar la sintaxis con el dólar en lugar de la contrabarra.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

beni0888

14/11/2011
Nuevos artículos ya, por favor!!
Enhorabuena por el excelente manual, tan sólo me gustaría pedirle que por favor no se olviden de él y continúen añadiendo nuevos artículos.
Un saludo!!

Iván

26/1/2012
Excelente tutorial
Muchas gracias por este tutorial. También sirve para las versiones más nuevas del framework, solo cambiando un par de cosas.

Gracias por la ayuda!!

ZuoIgiSzFJKafwrU

25/3/2012
FEaQotGihjDPpPl
What I find so interesting is you could never find this anywehre else.