laravel

Cuidado con las rutas de Laravel

Introducción

Las rutas de Laravel son una gran herramienta que nos permite construir una api rápidamente, y de forma fácil y eficaz. Simplemente tenemos que definir una ruta así:

See the gist on github.

Para después poder consumirla con una petición get a sitio.com/api/usuarios (por ejemplo). De esta manera nos evitamos parsear la ruta y muchas cosas que son laboriosas.

También podemos definir una ruta para que coincida con variables. Por ejemplo, la siguiente ruta muestra las ventas de algún año:

See the gist on github.

Podemos consumirla llamando a sitio.com/api/ventas/2017 y obtendríamos las ventas del año 2017 (en un caso teórico).

Conforme nuestras rutas crezcan, puede que olvidemos las rutas que hemos definido anteriormente y que incluso repitamos algunas de ellas.

Descripción del problema o error

Como se vio anteriormente, podemos obtener las ventas de un año con la siguiente ruta:

See the gist on github.

Y puede que después definamos una ruta para obtener las ventas canceladas, así:

See the gist on github.

Si ahora llamamos a sitio.com/api/ventas/2017 obtendremos las ventas del 2017, claro está. Y si quiero las ventas canceladas podría llamar a sitio.com/api/ventas/canceladas.

Pues aquí está el problema, ya que al llamar a sitio.com/api/ventas/canceladas Laravel pensará que estamos consultando las ventas por año, y que queremos las ventas en donde el año sea “canceladas” cosa que no tiene sentido. Lo que en realidad queremos son las ventas canceladas.

Esto podría traernos muchos errores, ya que no sabríamos por qué al llamar a sitio.com/api/ventas/canceladas no nos está devolviendo nada.

Solución

Podemos hacer dos cosas: renombrar nuestras rutas o delimitarlas con una expresión regular.

Renombrando rutas

Una solución que no me gusta mucho pero que funciona es renombrar nuestras rutas. Por ejemplo, podemos cambiar a que las ventas por año sean así:

See the gist on github.

Y ahora al llamar a ventas canceladas las rutas no se confundirán. Ya que para las ventas canceladas se llamará a sitio.com/api/ventas/canceladas y para las ventas por año se llamará a sitio.com/api/ventas/anio/2017 (agregamos anio antes de la variable).

De esta manera ya no chocarán. A mí se me hace una solución no tan práctica, pero funciona perfectamente y no tiene nada de malo.

Restringiendo rutas con expresión regular

Otra solución que me gusta más es hacer que la ruta coincida sólo si ésta coincide a su vez con una expresión regular. Es decir, podemos usar el método where de las rutas, para indicar que queremos que coincida sólo si es un número.

La ruta de las ventas por año quedaría así:

See the gist on github.

Simplemente estamos indicando que coincida sólo si la variable año es un número de 4 dígitos.

Así que al llamar a sitio.com/api/ventas/2017 obtendremos las ventas del 2017, ya que 2017 es un año de 4 dígitos.

Al llamar a sitio.com/api/ventas/canceladas la ruta no coincidirá, ya que “canceladas” no es un año, por lo que Laravel buscará otra ruta para ver si coincide antes de lanzar un error. Y como encontrará la ruta de las ventas canceladas, caerá ahí y obtendremos correctamente lo que queremos.

Usar las expresiones regulares también nos ayuda a mejorar un poco nuestra aplicación, y a delimitar datos para evitar errores.

Referencias

Aquí dejo algunos enlaces que pueden ser de ayuda para entender mejor esto

Documentación oficial de las rutas de Laravel

Expresión regular para un año de 4 dígitos

Probar expresiones regulares online

Aprende más sobre Laravel aquí.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

Entradas recientes

Imprimir PDF con Bot de Telegram

La impresión de un PDF en cualquier impresora se puede automatizar con un bot de…

13 horas hace

Enviar mensaje con bot de Telegram usando JavaScript (lado del cliente)

Hoy te enseñaré cómo enviar un mensaje a un usuario desde un bot de Telegram…

1 día hace

PHP: incrustar imagen en base64

El día de hoy te enseñaré algo muy sencillo pero útil al programar con PHP:…

1 día hace

Plugin ESC POS – Actualización 3.4.0: imprimir HTML

El plugin para imprimir en impresoras térmicas alcanza hoy su versión 3.4.0 agregando soporte para…

2 días hace

JavaScript (lado del cliente): leer pixeles de imagen

En ocasiones es necesario leer los pixeles y colores de una imagen con JavaScript del…

1 semana hace

PHP y JavaScript: llenar select con AJAX

Siguiendo con los tutoriales de listas desplegables o select con JavaScript, vamos a ver cómo…

1 semana hace

Esta web usa cookies.