Expresiones regulares y uso del enrutador routes.php de CakePHP

Después de algo mas de un año trabajando con CakePHP todavía estoy aprendiendo y mejorando una de las “piedras angulares” del framework CakePHP y es a usar y manejar el enrutador, el archivo routes.php

El framework MVC de CakePHP es fantástico para el desarrollo de aplicaciones y webs con cierta soltura y rapidez y es uno de sus puntos fuertes, pero y el SEO? las urls amigables en CakePHP son algo ortopédicas y poco “naturales” a no ser que utilicemos el routes.php porque al Sr. Google no se gusta nada una url que diga : mi_proyecto.com/articulos/post/1 . Esta es la estructura que propone cakephp para el desarrollo “ágil” de aplicaciones, un controlador llamado articulos_controller.php una acción o función llamada function post() y el identificador del post 1. Bien, pero esto no es amigable ni mucho menos RELEVANTE para Google y es aquí cuando surge routes.php para solventar la carencia de crear urls relevantes y útiles a nivel SEO.

Pero como he indicado en la primera frase de mi artículo, llevo mas de un año usando cakephp y routes.php y cada día descubro algo nuevo y voy optimizando el código más y más. Para usar routes.php se necesita un buen conocimiento de expresiones regulares, pues son la manera en la que optimizaremos nuestro routes.php y crearemos patrones para enrutar y dirigir grupos de urls a determinados controladores y acciones.

La conclusión de este post la voy a indicar antes de terminarlo, y es que para poder tener una buena aplicación con urls amigables hay que usar routes.php pero para esto EXPRESIONES REGULARES. Esta es la clave, controlar las expresiones regulares y saberlas hacer de tal manera que puedas enrutar cualquier url a donde quieras.
Una excelente página que me ha ayudado mucho para todo el tema de expresiones regulares es esta http://www.regular-expressions.info/tutorial.html

En este artículo pondré algunas de las expresiones regulares en php que uso y manejo en el enrutador routes.php de CakePHP. Son a modo de ejemplo pero pueden servir a modo de guía y tutorial.

Algo simple, expresión regular para todo lo que contenga letras. De modo que en mi parámetro slug solo pueda contener repeticiones de letras.

Router::connect('/s', array('controller'=>'buscador', 'action'=>'index'),array('pass' => array('id', 'slug'),'id' => '[a-z]+'));

Expresión regular para números. El parámetro page contendrá una repetición de números

Router::connect('/articulos/:page',
array('controller'=>'articulos','action'=>'index'),
array('pass'=>array('page'),'page'=>'[0-9]+'));

* Los corchetes combinado con el guión en expresiones regulares se usan para agrupar un rango de valores [0-9]
Se pueden crear expresiones regulares con número mucho mas complejas

1[0-9][0-9] /con esto tendremos un valor entre 100 y 199
2[0-4][0-9] /tendremos un valor entre 200 y 249
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5] // 123 ó 12345 esta tiene 2 soluciones
^[0-4]?[0-9]$ // usando anchors de expresiones regulares se consigue crear mas complejidad. Solucion: 0 ó 00..49

Expresión regular para parametrizar una url con letras y números, de manera que las letras son fijas pero los números pueden variar

Router::connect('/recetas/:tiempo',
array('controller' => 'recetas', 'action' => 'filtrado'),
array('pass'=>array('tiempo'),'tiempo'=>'de-[0-9]+-a-[0-9]+-minutos'));

Expresión regular para validar algo con números, letras, guiones y guiones bajos. En este caso el parámetro slug le permito que pueda contener cualquiera de los caracteres indicados.

Router::connect('/preguntas/:slug-:id',
array('controller'=>'preguntas', 'action'=>'ver'),
array('pass' => array('id','slug'),'id' => '[0-9]+','slug' => '[0-9a-z-_]+'));

Expresión regular para obtener un resultado de un grupo de opciones

Router::connect('/canciones/:idioma', array('controller'=>'canciones', 'action'=>'buscar'),
array('pass'=>array('idioma'),'idioma'=>'(?:espanol|portugues|ingles|frances)?'));

La agrupación en expresiones regulares se realiza mediante paréntesis () y para generar un rango de opciones se usa el pipe |
Es muy importante poner ?: al inicio del paréntesis y ? al final de este para que no nos devuelva en el array de salida $this->params una variable más con el resultado obtenido de la expresión regular. Pero si se quiere también se puede poner la agrupación así

(espanol|catalan|vasco|gallego|portugues|ingles|frances)

Expresión regular para valores opcionales.

Nov(iembre)? devolverá Nov y Noviembre

Se puede incluir los valores opcionales que quieras agrupándolos con paréntesis () y colocando la interrogación ? al final del cierre de paréntesis

Expresión regular para repeticiones

Router::connect('/articulos/:page',
array('controller'=>'articulos','action'=>'index'),
array('pass'=>array('page'),'page'=>'[0-9]+'));

[0-9]+ Repetirá los caracteres previos una o más veces
[0-9]* Repetirá los caracteres previos cero o más veces
[0-9]{n} Repetirá el ultimo carácter n veces.
[0-9]{n,m} Repetirá el ultimo carácter entre n y m veces.

Expresión regular con anchor *.
El * es un patrón que valida la repetición de cero y más caracteres.
En este caso le estoy pasando al una variable adicional a la funcion index() del controller fotos que es redireccionar. Esta tiene un valor que yo le asigno y después podré utilizarla para mi lógica.

Router::connect('/fotos/imagenes_viejas/(.*)', 
array('controller'=>'fotos', 'action'=>'index','redireccionar'=>'1')); 

Algunos anchors fundamentales en expresiones regulares:

^

Indica el inicio del patrón de una expresión regular.

$

Indica el final del patrón de una expresión regular

|

El pipe. Hace que el motor de expresiones regulares pueda validar cualquiera de la parte en el lado izquierdo, o la parte en el lado derecho. Puede usarse en una serie de opciones.

?

Hace que el ítem anterior sea opcional.

Éstos son algunos ejemplos de expresiones regulares que he usado en el routes.php pero se pueden hacer mucho más complejos y usarlo para infinidad de casos y patrones.
Seguiré actualizando este post a medida que vaya desarrollando patrones de expresiones regulares interesantes en el routes.php.

Una respuesta a “Expresiones regulares y uso del enrutador routes.php de CakePHP”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *