3. Rutas (Routing) en Laravel
Rutas (Routing) en Laravel
Section titled “Rutas (Routing) en Laravel”El sistema de rutas de Laravel es una parte fundamental del framework que permite definir cómo la aplicación responde a las solicitudes HTTP. Las rutas se definen en archivos ubicados en el directorio
routes/Archivos de rutas principales
Section titled “Archivos de rutas principales”| Archivo | Descripción |
|---|---|
| Rutas para la interfaz web |
| Rutas para la API |
| Comandos de consola personalizados |
| Canales de broadcasting |
Definir rutas básicas
Section titled “Definir rutas básicas”Laravel proporciona métodos para definir rutas para todos los verbos HTTP comunes. Cada método acepta dos parámetros: la URI y una función callback o un controlador.
Rutas GET
Section titled “Rutas GET”Las rutas GET se utilizan para solicitar datos del servidor sin modificarlos.
// En routes/web.phpuse IlluminateSupportFacadesRoute;
Route::get('/usuarios', function () { return 'Lista de usuarios';});
// Usando un controladorRoute::get('/usuarios', [UsuarioController::class, 'index']);Rutas POST
Section titled “Rutas POST”Las rutas POST se utilizan para enviar datos al servidor, como al enviar un formulario.
Route::post('/usuarios', function () { // Lógica para crear un nuevo usuario return 'Usuario creado';});
// Usando un controladorRoute::post('/usuarios', [UsuarioController::class, 'store']);Rutas PUT/PATCH
Section titled “Rutas PUT/PATCH”Las rutas PUT y PATCH se utilizan para actualizar recursos existentes.
Route::put('/usuarios/{id}', function ($id) { // Lógica para actualizar un usuario return 'Usuario ' . $id . ' actualizado';});
Route::patch('/usuarios/{id}', [UsuarioController::class, 'update']);Rutas DELETE
Section titled “Rutas DELETE”Las rutas DELETE se utilizan para eliminar recursos.
Route::delete('/usuarios/{id}', function ($id) { // Lógica para eliminar un usuario return 'Usuario ' . $id . ' eliminado';});
Route::delete('/usuarios/{id}', [UsuarioController::class, 'destroy']);Rutas para múltiples verbos HTTP
Section titled “Rutas para múltiples verbos HTTP”Si necesitas que una ruta responda a múltiples verbos HTTP, puedes usar el método
matchRoute::match(['get', 'post'], '/usuarios/buscar', function () { // Lógica para buscar usuarios});
// O para todos los verbos HTTPRoute::any('/usuarios/acciones', function () { // Responde a cualquier verbo HTTP});<form action="/usuarios/1" method="POST"> @csrf @method('PUT') <!-- Campos del formulario --> <button type="submit">Actualizar</button></form>Rutas con parámetros
Section titled “Rutas con parámetros”Las rutas con parámetros permiten capturar segmentos de la URI para utilizarlos en tu aplicación. Estos parámetros se definen en la ruta utilizando llaves
{}Parámetros requeridos
Section titled “Parámetros requeridos”Los parámetros requeridos se definen con llaves y se pasan como argumentos a la función de callback o método del controlador.
Route::get('/usuarios/{id}', function ($id) { return 'Usuario con ID: ' . $id;});
// Múltiples parámetrosRoute::get('/posts/{post}/comentarios/{comentario}', function ($postId, $comentarioId) { return 'Post ' . $postId . ', comentario ' . $comentarioId;});Parámetros opcionales
Section titled “Parámetros opcionales”Los parámetros opcionales se definen añadiendo un signo de interrogación
?Route::get('/usuarios/{nombre?}', function ($nombre = 'invitado') { return 'Hola ' . $nombre;});
// Con controladorRoute::get('/productos/{categoria?}', [ProductoController::class, 'index']);Restricciones de parámetros
Section titled “Restricciones de parámetros”Puedes restringir el formato de los parámetros de ruta utilizando el método
whereRoute::get('/usuarios/{id}', function ($id) { return 'Usuario ' . $id;})->where('id', '[0-9]+'); // Solo números
// Múltiples restriccionesRoute::get('/posts/{post}/comentarios/{comentario}', function ($postId, $comentarioId) { // Lógica de la ruta})->where([ 'post' => '[0-9]+', 'comentario' => '[0-9]+']);
// Restricciones comunesRoute::get('/categoria/{slug}', function ($slug) { // Lógica de la ruta})->whereAlpha('slug'); // Solo caracteres alfabéticosRestricciones globales
Section titled “Restricciones globales”Si deseas que un parámetro de ruta siga siempre un patrón específico en toda tu aplicación, puedes definir restricciones globales en el método
bootRouteServiceProvider// En app/Providers/RouteServiceProvider.phppublic function boot(): void{ Route::pattern('id', '[0-9]+'); // Todas las {id} deben ser numéricas
// ...}Rutas nombradas
Section titled “Rutas nombradas”Las rutas nombradas te permiten generar URLs o redirecciones a rutas específicas sin tener que recordar sus URIs. Esto es útil cuando las URIs cambian, ya que solo necesitarás actualizar la definición de la ruta, no todas las referencias a ella en tu código.
Asignar nombres a las rutas
Section titled “Asignar nombres a las rutas”Para asignar un nombre a una ruta, utiliza el método
nameRoute::get('/perfil/usuario', function () { // Lógica de la ruta})->name('perfil.usuario');
// Con controladorRoute::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard');Generar URLs a partir de rutas nombradas
Section titled “Generar URLs a partir de rutas nombradas”Una vez que has asignado un nombre a una ruta, puedes generar URLs o redirecciones utilizando los helpers
route()redirect()->route()// Generar una URL$url = route('perfil.usuario'); // http://ejemplo.com/perfil/usuario
// Con parámetros$url = route('usuarios.show', ['id' => 1]); // http://ejemplo.com/usuarios/1
// Con parámetros y query string$url = route('usuarios.index', ['sort' => 'nombre', 'order' => 'asc']);// http://ejemplo.com/usuarios?sort=nombre&order=asc
// Redireccionar a una ruta nombradareturn redirect()->route('perfil.usuario');
// Redireccionar con parámetrosreturn redirect()->route('usuarios.show', ['id' => 1]);Verificar la ruta actual
Section titled “Verificar la ruta actual”Puedes verificar si la ruta actual coincide con un nombre específico utilizando el método
named()Route// Verificar si la ruta actual es 'perfil.usuario'if (Route::currentRouteName() === 'perfil.usuario') { // Lógica específica}
// O usando el helper named()if (Route::named('perfil.*')) { // Coincide con cualquier ruta que comience con 'perfil.'}Uso en plantillas Blade
Section titled “Uso en plantillas Blade”En las plantillas Blade, puedes generar URLs a rutas nombradas utilizando el helper
route()<a href="{{ route('perfil.usuario') }}">Ver perfil</a>
<!-- Con parámetros --><a href="{{ route('usuarios.show', ['id' => $usuario->id]) }}">Ver usuario</a>
<!-- Verificar la ruta actual para marcar elementos de menú como activos --><a href="{{ route('dashboard') }}" class="{{ Route::currentRouteName() === 'dashboard' ? 'active' : '' }}"> Dashboard</a>Agrupación de rutas
Section titled “Agrupación de rutas”La agrupación de rutas te permite compartir atributos comunes, como middleware, prefijos de URL, espacios de nombres de controladores y más, entre un conjunto de rutas sin tener que definir estos atributos en cada ruta individual.
Agrupación básica
Section titled “Agrupación básica”Para crear un grupo de rutas, utiliza el método
Route::group()Route::group([], function () { Route::get('/usuarios', function () { // ... });
Route::get('/usuarios/{id}', function ($id) { // ... });});Prefijos de URL
Section titled “Prefijos de URL”El atributo
prefixRoute::group(['prefix' => 'admin'], function () { // Ruta: /admin/dashboard Route::get('/dashboard', function () { return 'Panel de administración'; });
// Ruta: /admin/usuarios Route::get('/usuarios', [AdminController::class, 'usuarios']);
// Rutas anidadas: /admin/reportes/ventas Route::prefix('reportes')->group(function () { Route::get('/ventas', [ReporteController::class, 'ventas']); Route::get('/usuarios', [ReporteController::class, 'usuarios']); });});Middleware
Section titled “Middleware”El atributo
middleware// Aplicar un solo middlewareRoute::middleware('auth')->group(function () { Route::get('/dashboard', [DashboardController::class, 'index']); Route::get('/perfil', [PerfilController::class, 'show']);});
// Aplicar múltiples middlewareRoute::middleware(['auth', 'verified'])->group(function () { Route::get('/configuracion', [ConfiguracionController::class, 'index']); Route::post('/configuracion', [ConfiguracionController::class, 'update']);});Espacio de nombres de controladores
Section titled “Espacio de nombres de controladores”El atributo
namespaceRoute::namespace('AppHttpControllersAdmin')->group(function () { // Los controladores estarán en AppHttpControllersAdmin Route::get('/dashboard', [DashboardController::class, 'index']);});Prefijos de nombres de rutas
Section titled “Prefijos de nombres de rutas”El atributo
nameRoute::name('admin.')->group(function () { Route::get('/admin/dashboard', function () { // ... })->name('dashboard');
// Nombre de ruta: admin.usuarios.index Route::get('/admin/usuarios', function () { // ... })->name('usuarios.index');});Agrupación por dominio
Section titled “Agrupación por dominio”Puedes agrupar rutas por dominio o subdominio utilizando el atributo
domain// Rutas para un subdominio específicoRoute::domain('admin.ejemplo.com')->group(function () { Route::get('/', [AdminController::class, 'index']);});
// Rutas con parámetros de subdominioRoute::domain('{cuenta}.ejemplo.com')->group(function () { Route::get('/', function ($cuenta) { return 'Cuenta: ' . $cuenta; });});Combinación de múltiples atributos
Section titled “Combinación de múltiples atributos”Puedes combinar múltiples atributos en un solo grupo:
Route::prefix('api') ->middleware(['api', 'auth:api']) ->namespace('AppHttpControllersApi') ->name('api.') ->group(function () { Route::get('/usuarios', [UsuarioController::class, 'index'])->name('usuarios.index'); Route::post('/usuarios', [UsuarioController::class, 'store'])->name('usuarios.store'); });Redirecciones y respuestas personalizadas
Section titled “Redirecciones y respuestas personalizadas”Laravel proporciona varias formas de devolver respuestas desde tus rutas, incluyendo redirecciones, respuestas JSON, descargas de archivos y más.
Respuestas básicas
Section titled “Respuestas básicas”La forma más simple de devolver una respuesta es retornando una cadena de texto o un array desde una ruta o controlador:
Route::get('/saludo', function () { return 'Hola mundo'; // Respuesta de texto simple});
Route::get('/datos', function () { return ['nombre' => 'Juan', 'edad' => 30]; // Se convierte automáticamente a JSON});Respuestas con códigos de estado HTTP
Section titled “Respuestas con códigos de estado HTTP”Puedes especificar un código de estado HTTP personalizado utilizando el helper
response()Route::get('/no-autorizado', function () { return response('No autorizado', 401);});
Route::get('/no-encontrado', function () { return response('No encontrado', 404);});Respuestas con encabezados personalizados
Section titled “Respuestas con encabezados personalizados”Puedes añadir encabezados HTTP personalizados a tus respuestas:
Route::get('/documento', function () { return response('Contenido del documento') ->header('Content-Type', 'text/plain') ->header('X-Header-Personalizado', 'Valor personalizado');});Respuestas JSON
Section titled “Respuestas JSON”Para devolver una respuesta JSON con el encabezado
Content-Type: application/jsonjson()Route::get('/api/usuarios', function () { return response()->json([ 'nombre' => 'Juan', 'apellido' => 'Pérez', 'email' => 'juan@ejemplo.com' ]);});
// Con código de estado personalizadoRoute::post('/api/usuarios', function () { return response()->json(['mensaje' => 'Usuario creado'], 201);});Redirecciones
Section titled “Redirecciones”Para redireccionar a otra URL o ruta, utiliza el helper
redirect()// Redireccionar a una URLRoute::get('/redirigir', function () { return redirect('https://laravel.com');});
// Redireccionar a una ruta nombradaRoute::get('/ir-a-inicio', function () { return redirect()->route('inicio');});
// Redireccionar a una ruta con parámetrosRoute::get('/ir-a-perfil', function () { return redirect()->route('usuarios.perfil', ['id' => 1]);});
// Redireccionar a la página anteriorRoute::post('/cancelar', function () { return redirect()->back();});
// Redireccionar con datos de sesión flashRoute::post('/guardar', function () { return redirect()->route('dashboard') ->with('mensaje', 'Datos guardados correctamente');});Descargas de archivos
Section titled “Descargas de archivos”Para generar una respuesta de descarga de archivo, utiliza el método
download()// Descargar un archivo con su nombre originalRoute::get('/descargar/archivo', function () { return response()->download(storage_path('app/archivo.pdf'));});
// Descargar con un nombre personalizadoRoute::get('/descargar/reporte', function () { return response()->download( storage_path('app/reportes/datos.pdf'), 'reporte-anual.pdf' );});
// Mostrar un archivo en el navegador en lugar de descargarloRoute::get('/ver/imagen', function () { return response()->file(storage_path('app/public/imagen.jpg'));});Respuestas de vista
Section titled “Respuestas de vista”Para devolver una vista como respuesta, utiliza el helper
view()Route::get('/bienvenida', function () { return view('bienvenida');});
// Con datos para la vistaRoute::get('/perfil/{id}', function ($id) { $usuario = Usuario::find($id); return view('usuarios.perfil', ['usuario' => $usuario]);});
// Con datos usando el método with()Route::get('/dashboard', function () { return view('dashboard') ->with('nombre', 'Juan') ->with('rol', 'Administrador');});Conclusión
Section titled “Conclusión”El sistema de rutas de Laravel es flexible y potente, permitiendo organizar fácilmente cómo tu aplicación responde a las solicitudes HTTP. Utilizando las características como rutas nombradas, agrupación y parámetros, puedes crear una estructura de rutas limpia y mantenible para tu aplicación.