Laravel nos permite agregar filtros en nuestras rutas para verificar la data que el usuario está enviando a través de la URL y dirigirlo a la acción correcta, sin necesidad de utilizar middleware, validaciones u otro tipo de estructura de control, tan solo haciendo uso del método where()
dentro del archivo de rutas.
El componente de rutas de Laravel permite capturar las peticiones realizadas por un usuario, de tal manera que podamos evaluar los parámetros enviados y devolver la respuesta acorde a cada petición.
Cuando iniciamos un nuevo proyecto, las rutas se establecen por defecto dentro del archivo web.php
en el directorio routes/
, en este archivo podrás ver algo similar a esto:
<?php Route::get('/', function () { return view('welcome'); });
Esta es una ruta de tipo GET la cual le mostrará al usuario la vista welcome. Laravel almacena las vistas en el directorio resources/views utilizando la extensión .blade.php
Ahora, vamos a agregar una ruta para consultar los detalles de un usuario, por ejemplo:
<?php Route::get('user/{id}', function ($id) { return 'Mostrar usuario: '.$id; });
Si probamos esta nueva ruta en el navegador pasando el id
de un usuario ficticio, veremos el siguiente resultado:
¡Que bien! podemos ver el id
del usuario, pero… ¿Qué pasa si en lugar de un id
numérico enviamos una cadena de texto?
¡Exacto! nuestra ruta tiene un comportamiento no deseado. Una forma de solventar esto es aplicando:
Filtros en rutas
Podemos utilizar filtros en nuestras rutas encadenando en ellas el método where()
, el cual va a aceptar como primer argumento el nombre del parámetro de la ruta y, como segundo argumento, una expresión regular.
Por ejemplo, vamos a hacer que la ruta que creamos solo reciba números:
Route::get('user/{id}', function ($id) { return 'Mostrar usuario: '.$id; })->where(['id' => '\d+']);
Ahora, si probamos en el navegador, veremos que al pasar a nuestra ruta una cadena de texto en lugar del id
del usuario, recibiremos una respuesta 404.
En cambio, si pasamos un id
ficticio, recibiremos el resultado esperado.
Si quieres que todos los parámetros id de todas las rutas de tu aplicación solo puedan contener números, agrega lo siguiente al método boot
de app/Providers/RouteServiceProvider.php
:
/** * Define your route model bindings, pattern filters, etc. * * @return void */ public function boot() { Route::pattern('id', '[0-9]+'); parent::boot(); }
Puedes aprender más viendo nuestro curso gratuito Primeros Pasos con Laravel 6.
Regístrate hoy en Styde y obtén acceso a todo nuestro contenido.