Rutas con filtros en Laravel 6

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:

ruta en el navegador

 

¡Que bien! podemos ver el id del usuario, pero… ¿Qué pasa si en lugar de un id numérico enviamos una cadena de texto?

ruta en el navegador

 

¡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.