4-Controladores en Laravel
Controladores en Laravel: Manejo de Requests Avanzado
En Laravel, los controladores son el corazón de la lógica de tu aplicación. Te permiten manejar las solicitudes HTTP, procesar datos y devolver respuestas. En este tutorial, profundizaremos en cómo trabajar con el objeto Request para:
Obtener todo el contenido de un request
Validar inputs específicos
Acceder a información adicional del request (headers, IP, método HTTP, etc.)
1. Creación de un Controlador
Primero, crea un controlador usando Artisan:
php artisan make:controller UserController2. Obtener Todo el Contenido del Request
Laravel inyecta automáticamente el objeto Illuminate\Http\Request en los métodos del controlador.
Ejemplo: Recuperar todos los datos del request
use Illuminate\Http\Request;
class UserController extends Controller
{
public function store(Request $request)
{
// Obtener todos los datos del request (formulario, JSON, etc.)
$allData = $request->all();
// Mostrar los datos (útil para debugging)
dd($allData);
// También puedes usar:
// $request->input() → Equivalente a all(), pero permite valores por defecto
}
}📌 Uso común:
$request->all()→ Devuelve un array asociativo con todos los inputs.$request->input()→ Similar aall(), pero permite definir un valor por defecto si el campo no existe.
3. Validar Inputs Específicos
Laravel ofrece validación integrada para asegurar que los datos cumplan ciertas reglas.
Ejemplo: Validar campos obligatorios
public function store(Request $request)
{
// Validación básica
$validatedData = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|min:8',
]);
// Si pasa la validación, continuamos
return response()->json(['success' => 'Usuario creado!']);
}📌 Reglas comunes:
required→ El campo es obligatorio.email→ Debe ser un email válido.unique:users→ El email no debe existir en la tablausers.min:8→ Mínimo 8 caracteres.
💡 Métodos alternativos para acceder a inputs específicos:
$name = $request->input('name'); // Obtiene el campo 'name'
$email = $request->email; // Sintaxis alternativa (propiedad dinámica)
$defaultValue = $request->input('role', 'user'); // Valor por defecto si no existe4. Información Adicional del Request
El objeto Request en Laravel proporciona datos útiles más allá de los inputs del formulario.
Ejemplo 1: Obtener headers, IP y método HTTP
public function getUserAgent(Request $request)
{
$userAgent = $request->header('User-Agent'); // Obtiene el User-Agent
$clientIp = $request->ip(); // IP del cliente
$method = $request->method(); // GET, POST, PUT, etc.
return response()->json([
'user_agent' => $userAgent,
'ip' => $clientIp,
'method' => $method,
]);
}Ejemplo 2: Verificar el tipo de contenido (Content-Type)
if ($request->isJson()) {
// El request viene con Content-Type: application/json
$data = $request->json()->all();
}Ejemplo 3: Obtener la URL y ruta actual
$url = $request->url(); // URL sin query strings
$fullUrl = $request->fullUrl(); // URL con query strings
$path = $request->path(); // Ej: "/api/users" (sin dominio)5. Manejo de Archivos Subidos
Si el request incluye archivos (ej: formulario con enctype="multipart/form-data"), puedes manejarlos así:
public function uploadPhoto(Request $request)
{
if ($request->hasFile('photo')) {
$file = $request->file('photo');
$fileName = $file->store('profile-photos'); // Guarda en storage/app/profile-photos
return response()->json(['file' => $fileName]);
}
return response()->json(['error' => 'No se subió ningún archivo'], 400);
}Conclusión
$request->all()→ Obtiene todos los inputs.$request->validate()→ Valida campos con reglas predefinidas.$request->header(),$request->ip()→ Accede a metadatos del request.$request->file()→ Maneja archivos subidos.
Ejemplo con PastelesController
En Laravel, los controladores de recursos (Resource Controllers) nos permiten manejar operaciones CRUD de manera estructurada. En este post, analizaremos un fragmento de código de un PastelesController, corregiremos errores y lo completaremos para que sea funcional.
Versión Corregida y Completada
1. Controlador de Recursos (PastelesController)
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Pastel; // Asumiendo que tenemos un modelo Pastel
class PastelesController extends Controller
{
/**
* Muestra una lista de todos los pasteles.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$pasteles = Pastel::all(); // Obtiene todos los pasteles
return view('pasteles.index', compact('pasteles'));
}
/**
* Muestra el formulario para crear un nuevo pastel.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('pasteles.create');
}
// ... (métodos restantes: store, show, edit, update, destroy)
}2. Rutas (web.php)
Para usar el controlador de recursos, registra sus rutas automáticamente:
use App\Http\Controllers\PastelesController;
Route::resource('pasteles', PastelesController::class);Esto crea las 7 rutas típicas de un CRUD:
GET /pasteles→index()GET /pasteles/create→create()POST /pasteles→store()... etc.
¿Cómo Probar el Controlador?
Listar pasteles (
index):Crea una vista
resources/views/pasteles/index.blade.php.Usa
@foreach ($pasteles as $pastel)para mostrar los datos.
Formulario de creación (
create):Crea
resources/views/pasteles/create.blade.phpcon un formulario para añadir pasteles.
Métodos pendientes:
Implementa
store()para guardar datos.Añade
edit(),update(), ydestroy()para completar el CRUD.
Conclusión
Los controladores de recursos en Laravel organizan las operaciones CRUD de manera limpia.
Usa
Route::resource()para generar rutas automáticamente.Siempre verifica namespaces, imports y sintaxis para evitar errores.
🔹 ¿Quieres un ejemplo completo con todos los métodos? ¡Dímelo en los comentarios!
📌 Bonus:
Usa
php artisan make:controller PastelesController --resourcepara generar el esqueleto automáticamente.Añade validación de datos con
$request->validate([])enstore()yupdate().
public function index()
{
$pasteles = Pastel::get();
return view('pasteles.index')->with('pasteles', $pasteles);
} public function create()
{
return view('pasteles.create');
} public function store(Request $request)
{
$pastel = new Pastel;
$pastel->nombre = $request->input('nombre');
$pastel->sabor = $request->input('sabor');
$pastel->save();
return redirect()->route('pasteles.index');
}public function edit($id)
{
$pastel = Pastel::find($id);
return view('pasteles.edit')->with('pastel',$pastel);
} public function update(Request $request, $id)
{
$pastel = Pastel::find($id);
$pastel->nombre = $request->input('nombre');
$pastel->sabor = $request->input('sabor');
$pastel->save();
return redirect()->route('pasteles.index');
} // Esta es la primer opcion
public function destroy($id)
{
$pastel = Pastel::find($id);
$pastel->delete();
return redirect()->route('pasteles.index');
} // Esta es la segunda opcion
public function destroy($id)
{
Pastel::destroy($id);
return redirect()->route('pasteles.index');
}public function index()
{
$tasks = Task::latest()->get();
return view('tasks.index', compact('tasks'));
}
public function create()
{
return view('tasks.create');
}
public function store(Request $request)
{
$request->validate([
'name' => 'required|max:255',
]);
Task::create($request->all());
return redirect()->route('tasks.index')
->with('success', 'Tarea creada correctamente');
}
public function show(Task $task)
{
return view('tasks.show', compact('task'));
}
public function edit(Task $task)
{
return view('tasks.edit', compact('task'));
}
public function update(Request $request, Task $task)
{
$request->validate([
'name' => 'required|max:255',
]);
$task->update($request->all());
return redirect()->route('tasks.index')
->with('success', 'Tarea actualizada correctamente');
}
public function destroy(Task $task)
{
$task->delete();
return redirect()->route('tasks.index')
->with('success', 'Tarea eliminada correctamente');
}
Comentarios
Publicar un comentario