Cuando empiezas con Laravel es tentador escribir las URLs directamente en tus vistas:
<!-- ❌ URL hardcodeada -->
<a href="/users/{{ $user->id }}">Ver perfil</a>Funciona, pero es una mala práctica que te pasará factura cuando el proyecto crezca.
El problema de hardcodear URLs
Imagina que tienes esa URL /users/{id} escrita en 30 sitios diferentes: enlaces, redirecciones, formularios, tests... Un día decides cambiar la ruta a /profile/{id} porque tiene más sentido.
Ahora tienes que buscar y reemplazar en 30 sitios. Y si te dejas uno, tu aplicación tiene enlaces rotos.
La solución: rutas nombradas y route()
Laravel permite asignar un nombre a cada ruta:
<?php
// routes/web.php
Route::get('/users/{user}', [UserController::class, 'show'])->name('users.show');Y luego generar la URL usando ese nombre:
<!-- ✅ URL generada con route() -->
<a href="{{ route('users.show', $user) }}">Ver perfil</a>Si mañana cambias /users/{user} por /profile/{user}, solo modificas la definición de la ruta. Todos los route('users.show', $user) siguen funcionando.
Uso básico de route()
Sin parámetros
<?php
// Ruta: Route::get('/contact', ...)->name('contact');
route('contact');
// https://example.com/contactCon parámetros
<?php
// Ruta: Route::get('/users/{user}', ...)->name('users.show');
route('users.show', ['user' => 1]);
// https://example.com/users/1
// Si pasas un modelo, Laravel usa su ID automáticamente
route('users.show', $user);
// https://example.com/users/1Con query strings
<?php
route('users.index', ['status' => 'active', 'sort' => 'name']);
// https://example.com/users?status=active&sort=nameDónde usar route()
En vistas Blade
<a href="{{ route('users.show', $user) }}">Ver perfil</a>
<form action="{{ route('users.update', $user) }}" method="POST">
@csrf
@method('PUT')
<!-- campos -->
</form>En controladores
<?php
// Redirecciones
return redirect()->route('users.show', $user);
// O con el helper
return to_route('users.show', $user);En tests
<?php
it('shows the user profile', function () {
$user = User::factory()->create();
$this->get(route('users.show', $user))
->assertOk();
});Convenciones de nombres
Laravel tiene una convención para nombrar rutas de recursos:
Acción | Nombre de ruta | URL |
|---|---|---|
Listar | users.index | /users |
Crear (form) | users.create | /users/create |
Guardar | users.store | /users |
Ver | users.show | /users/{user} |
Editar (form) | users.edit | /users/{user}/edit |
Actualizar | users.update | /users/{user} |
Eliminar | users.destroy | /users/{user} |
Si usas Route::resource(), Laravel genera estas rutas con estos nombres automáticamente:
<?php
Route::resource('users', UserController::class);El mismo principio en APIs
Este concepto de no hardcodear URLs aplica también cuando trabajas con APIs y frontends separados. Si tu frontend (Vue, React, móvil) construye las URLs, estás creando un acoplamiento innecesario.
La solución en ese contexto se llama HATEOAS: el backend devuelve las URLs en cada respuesta y el frontend solo las consume. Si te interesa profundizar, te recomiendo leer qué es HATEOAS y por qué tu API debería devolver las URLs.
Conclusión
El helper route() es una de esas pequeñas cosas que marcan la diferencia entre un proyecto mantenible y uno que se convierte en un dolor de cabeza.
Usa rutas nombradas desde el principio. Tu yo del futuro te lo agradecerá cuando tengas que cambiar una URL y solo modifiques una línea.
Curso Laravel 12
Completo 2026
El único curso 100% actualizado que incluye Laravel 12, Livewire 3, Vue 3, React 19 e Inertia 2. Aprende con proyectos reales y las últimas funcionalidades.
star Incluido en cualquier suscripción