Restricciones de expresiones regulares
En Laravel, podemos usar expresiones regulares para controlar qué tipos de valores son aceptados en los parámetros de nuestras rutas. Esto nos ayuda a validar los datos que recibimos y a hacer nuestras rutas más seguras y precisas.
Dónde Escribir el Código
El código para definir rutas con restricciones de expresiones regulares debe escribirse en el archivo routes/web.php
de tu proyecto Laravel.
Ejemplos de Código
1. Restricciones Básicas con Expresiones Regulares
Route::get('/user/{name}', function (string $name) {
// ...
})->where('name', '[A-Za-z]+');
Route::get('/user/{id}', function (string $id) {
// ...
})->where('id', '[0-9]+');
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);
Explicación detallada:
Route::get('/user/{name}', ...)->where('name', '[A-Za-z]+')
:- Esta ruta acepta un parámetro ‘name’ en la URL.
- La expresión regular
[A-Za-z]+
significa que ‘name’ debe contener solo letras (mayúsculas o minúsculas) y al menos una letra. - Por ejemplo, «John» o «Alice» serían válidos, pero «John123» o «Alice!» no lo serían.
Route::get('/user/{id}', ...)->where('id', '[0-9]+')
:- Esta ruta acepta un parámetro ‘id’ en la URL.
- La expresión regular
[0-9]+
significa que ‘id’ debe contener solo números y al menos un número. - Por ejemplo, «123» o «456789» serían válidos, pero «12a» o «123!» no lo serían.
Route::get('/user/{id}/{name}', ...)->where(['id' => '[0-9]+', 'name' => '[a-z]+'])
:- Esta ruta acepta dos parámetros: ‘id’ y ‘name’.
- El ‘id’ debe ser numérico (como en el ejemplo anterior).
- El ‘name’ debe contener solo letras minúsculas.
- Por ejemplo, «/user/123/john» sería válido, pero «/user/123/John» o «/user/abc/john» no lo serían.
2. Métodos de Ayuda para Patrones Comunes
Route::get('/user/{id}/{name}', function (string $id, string $name) {
// ...
})->whereNumber('id')->whereAlpha('name');
Route::get('/user/{name}', function (string $name) {
// ...
})->whereAlphaNumeric('name');
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUuid('id');
Route::get('/user/{id}', function (string $id) {
// ...
})->whereUlid('id');
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', ['movie', 'song', 'painting']);
Route::get('/category/{category}', function (string $category) {
// ...
})->whereIn('category', CategoryEnum::cases());
Explicación detallada:
->whereNumber('id')->whereAlpha('name')
:whereNumber('id')
: Asegura que ‘id’ sea un número. Es equivalente a usar la expresión regular[0-9]+
.whereAlpha('name')
: Asegura que ‘name’ contenga solo letras (mayúsculas o minúsculas). Es similar a usar[A-Za-z]+
.- Ejemplo válido: «/user/123/John»
->whereAlphaNumeric('name')
:- Permite que ‘name’ contenga letras y números, pero no otros caracteres.
- Equivalente a usar la expresión regular
[A-Za-z0-9]+
. - Ejemplos válidos: «John123», «123ABC»
->whereUuid('id')
:- Verifica que ‘id’ tenga el formato de un UUID (Identificador Único Universal).
- Un UUID es una cadena de 36 caracteres, como «123e4567-e89b-12d3-a456-426614174000».
- Útil cuando usas UUIDs como identificadores en tu base de datos.
->whereUlid('id')
:- Verifica que ‘id’ tenga el formato de un ULID (Identificador Único Lexicográficamente Ordenable).
- Un ULID es una cadena de 26 caracteres, como «01ARZ3NDEKTSV4RRFFQ69G5FAV».
- Los ULIDs son similares a los UUIDs pero están ordenados lexicográficamente.
->whereIn('category', ['movie', 'song', 'painting'])
:- Restringe ‘category’ a solo estos valores específicos: «movie», «song», o «painting».
- Útil cuando tienes un conjunto fijo de categorías permitidas.
- Ejemplo válido: «/category/movie», pero «/category/book» no sería válido.
->whereIn('category', CategoryEnum::cases())
:- Similar al anterior, pero usa una enumeración de PHP para definir las categorías permitidas.
- CategoryEnum sería una clase de enumeración definida en tu código que lista todas las categorías válidas.
- Esto permite mantener la lista de categorías en un solo lugar en tu código, facilitando su mantenimiento.
Cómo Funciona en la Práctica
Cuando alguien intenta acceder a una URL que no cumple con las restricciones definidas, Laravel automáticamente devolverá una respuesta 404 (página no encontrada). Por ejemplo:
- Para la ruta
/user/{name}
con->where('name', '[A-Za-z]+')
:www.conozcalaravel.test/user/John
– Funcionaráwww.conozcalaravel.test/user/John123
– Devolverá un 404
- Para la ruta
/user/{id}
con->whereNumber('id')
:www.conozcalaravel.test/user/123
– Funcionaráwww.conozcalaravel.test/user/abc
– Devolverá un 404
Visualización en Chrome
Así es como se vería en tu navegador Chrome cuando una ruta cumple con las restricciones:
Información del usuario John
Y así es como se vería cuando una ruta no cumple con las restricciones:
404 | Página no encontrada
Conclusión
Las restricciones de expresiones regulares en las rutas de Laravel son una herramienta poderosa para validar los datos que recibimos en nuestras URLs. Nos permiten crear rutas más seguras y precisas, asegurando que solo los datos con el formato correcto lleguen a nuestras funciones de manejo de rutas. Además, los métodos de ayuda proporcionados por Laravel hacen que sea fácil aplicar restricciones comunes sin necesidad de escribir expresiones regulares complejas.
Para más información, puedes consultar:
Etiqueta:rutas