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:

  1. Obtener todo el contenido de un request

  2. Validar inputs específicos

  3. 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:

bash
Copy
Download
php artisan make:controller UserController

2. 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

php
Copy
Download
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 a all(), 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

php
Copy
Download
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 tabla users.

  • min:8 → Mínimo 8 caracteres.

💡 Métodos alternativos para acceder a inputs específicos:

php
Copy
Download
$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 existe

4. 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

php
Copy
Download
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)

php
Copy
Download
if ($request->isJson()) {
    // El request viene con Content-Type: application/json
    $data = $request->json()->all();
}

Ejemplo 3: Obtener la URL y ruta actual

php
Copy
Download
$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í:

php
Copy
Download
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
<?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:

php
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?

  1. Listar pasteles (index):

    • Crea una vista resources/views/pasteles/index.blade.php.

    • Usa @foreach ($pasteles as $pastel) para mostrar los datos.

  2. Formulario de creación (create):

    • Crea resources/views/pasteles/create.blade.php con un formulario para añadir pasteles.

  3. Métodos pendientes:

    • Implementa store() para guardar datos.

    • Añade edit()update(), y destroy() 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 --resource para generar el esqueleto automáticamente.

  • Añade validación de datos con $request->validate([]) en store() y update().


  public function index()
    {
        $pasteles = Pastel::get();
        return view('pasteles.index')->with('pasteles', $pasteles);
    }
d

    public function create()
    {
        return view('pasteles.create');
    }
w
   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');
    }
w
public function edit($id)
    {
        $pastel = Pastel::find($id);
        return view('pasteles.edit')->with('pastel',$pastel);
    }
w
    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');
    }
d
    // Esta es la primer opcion
    public function destroy($id)
    {
        $pastel = Pastel::find($id);
        $pastel->delete();
        return redirect()->route('pasteles.index');
    }
w
    // Esta es la segunda opcion
    public function destroy($id)
    {
        Pastel::destroy($id);
        return redirect()->route('pasteles.index');
    }

d
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');
}
d


Comentarios

Entradas más populares de este blog

8-Creación de una API RESTful con Laravel

02 -Rutas en Laravel

3-Rutas