Saltar al contenido

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/contact

Con 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/1

Con query strings

<?php

route('users.index', ['status' => 'active', 'sort' => 'name']);
// https://example.com/users?status=active&sort=name

Dó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.

school Curso completo

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.

access_time 8 horas de contenido
layers 4 tecnologías en 1
update 100% actualizado
code Proyectos prácticos
Ver Curso Laravel 12 arrow_forward

star Incluido en cualquier suscripción

Rutas de aprendizaje