2-EJERCICIO LARAVEL

Convenciones de Nomenclatura en Laravel

Aquí te explico las convenciones más comunes para nombrar elementos en Laravel, con ejemplos claros:

1. Modelos

  • Singular y en PascalCase (primera letra mayúscula)

  • Corresponden a una tabla en la base de datos

  • Ejemplo: UserPostProductCategory

php
// app/Models/User.php
class User extends Model
{
    // ...
}

2. Tablas de Base de Datos

  • Plural y en snake_case (minúsculas con guiones bajos)

  • Corresponden al modelo en singular

  • Ejemplo: userspostsproduct_categories

php
// En una migración
Schema::create('users', function (Blueprint $table) {
    $table->id();
    // ...
});

3. Controladores

  • Singular con sufijo Controller y en PascalCase

  • Para recursos, puedes usar NombreResourceController

  • Ejemplo: UserControllerPostControllerProductCategoryController

php
// app/Http/Controllers/UserController.php
class UserController extends Controller
{
    // ...
}

4. Variables en General

  • camelCase (primera letra minúscula, palabras siguientes con mayúscula inicial)

  • Ejemplo: $userName$totalAmount$isActive

5. Variables de Modelo (una instancia)

  • Singular y en camelCase

  • Representa una sola entidad/registro

  • Ejemplo: $user$post$productCategory

php
$user = User::find(1); // Una sola instancia de User

6. Variables de Modelo (múltiples instancias)

  • Plural y en camelCase

  • Representa una colección de entidades/registros

  • Ejemplo: $users$posts$productCategories

php
$users = User::all(); // Colección de usuarios


Ejemplo Completo

Modelo y Tabla:

php
// app/Models/Product.php
class Product extends Model
{
    // ...
}

// Migración
Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->string('product_name');
    // ...
});

Controlador:

php
// app/Http/Controllers/ProductController.php
class ProductController extends Controller
{
    public function index()
    {
        $products = Product::all(); // Colección
        return view('products.index', compact('products'));
    }

    public function show(Product $product) // Instancia única
    {
        $relatedProducts = $product->related()->get(); // Otra colección
        return view('products.show', compact('product', 'relatedProducts'));
    }
}

Vista:

php
// resources/views/products/index.blade.php
@foreach($products as $product)
    <p>{{ $product->product_name }}</p>
@endforeach

// resources/views/products/show.blade.php
<h1>{{ $product->product_name }}</h1>
@foreach($relatedProducts as $relatedProduct)
    <p>{{ $relatedProduct->product_name }}</p>
@endforeach

Comunicación entre Rutas, Controlador, Modelo y Vistas en Laravel

En Laravel, el flujo de una petición sigue el patrón MVC (Modelo-Vista-Controlador). Veamos cómo se comunican estos componentes con un ejemplo sencillo de agregar una tarea.

Estructura básica

  1. Ruta: Define la URL y qué controlador manejará la petición

  2. Controlador: Recibe la petición, interactúa con el modelo y devuelve una vista

  3. Modelo: Representa los datos y maneja la lógica de negocio con la base de datos

  4. Vista: Muestra la información al usuario (HTML simple en este caso)

Ejemplo: Agregar una tarea

1. Ruta (routes/web.php)

php
Route::get('/tareas', [TareaController::class, 'index'])->name('tareas.index');
Route::post('/tareas', [TareaController::class, 'store'])->name('tareas.store');

2. Controlador (app/Http/Controllers/TareaController.php)

php
<?php

namespace App\Http\Controllers;

use App\Models\Tarea;
use Illuminate\Http\Request;

class TareaController extends Controller
{
    public function index()
    {
        $tareas = Tarea::all();
        return view('tareas.index', compact('tareas'));
    }

    public function store(Request $request)
    {
        Tarea::create(['nombre' => $request->nombre]);
        return redirect()->route('tareas.index');
    }
}

3. Modelo (app/Models/Tarea.php)

php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Tarea extends Model
{
    use HasFactory;
    
    protected $fillable = ['nombre'];
}

4. Vista (resources/views/tareas/index.blade.php)

html
<!DOCTYPE html>
<html>
<head>
    <title>Tareas</title>
</head>
<body>
    <h1>Lista de Tareas</h1>
    
    <form method="POST" action="{{ route('tareas.store') }}">
        @csrf
        <input type="text" name="nombre" placeholder="Nueva tarea" required>
        <button type="submit">Agregar</button>
    </form>

    <ul>
        @foreach($tareas as $tarea)
            <li>{{ $tarea->nombre }}</li>
        @endforeach
    </ul>
</body>
</html>

Flujo de comunicación

  1. El usuario visita /tareas → La ruta llama a TareaController@index

  2. El controlador pide todas las tareas al modelo (Tarea::all())

  3. El modelo consulta la base de datos y devuelve los datos al controlador

  4. El controlador pasa los datos a la vista (view('tareas.index', compact('tareas')))

  5. La vista muestra el formulario y la lista de tareas

  6. Cuando el usuario envía el formulario (POST a /tareas):

    • La ruta llama a TareaController@store

    • El controlador usa el modelo para crear la nueva tarea (Tarea::create())

    • Finalmente redirige de vuelta a la lista de tareas

Este es el flujo básico de comunicación en Laravel usando el patrón MVC.

1. Del Controlador a la Vista

El controlador envía datos a la vista usando el método view() junto con un array asociativo.

Ejemplo:

Controlador (TaskController.php)

php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class TaskController extends Controller
{
    public function index()
    {
        // Datos que queremos pasar a la vista (ej: lista de tareas)
        $tasks = [
            'Lavar los platos',
            'Hacer la compra',
            'Estudiar Laravel'
        ];

        // Pasamos las tareas a la vista 'tasks.index'
        return view('tasks.index', ['tasks' => $tasks]);
    }
}

Vista (resources/views/tasks/index.blade.php)

html
<!DOCTYPE html>
<html>
<head>
    <title>Lista de Tareas</title>
</head>
<body>
    <h1>Mis Tareas</h1>
    <ul>
        @foreach($tasks as $task)
            <li>{{ $task }}</li>
        @endforeach
    </ul>
</body>
</html>

Resultado en el navegador:

text
Mis Tareas
- Lavar los platos
- Hacer la compra
- Estudiar Laravel

2. De la Vista al Controlador (Formulario)

Para enviar datos desde la vista al controlador (ej: añadir una nueva tarea), usamos un formulario y recibimos los datos con $request.

Ejemplo:

Vista (resources/views/tasks/index.blade.php)

html
<!-- Añadimos un formulario para nuevas tareas -->
<form action="{{ route('tasks.store') }}" method="POST">
    @csrf <!-- Token de seguridad -->
    <input type="text" name="task" placeholder="Nueva tarea">
    <button type="submit">Guardar</button>
</form>

Ruta (routes/web.php)

php
use App\Http\Controllers\TaskController;

Route::get('/tasks', [TaskController::class, 'index'])->name('tasks.index');
Route::post('/tasks', [TaskController::class, 'store'])->name('tasks.store');

Controlador (TaskController.php)

php
public function store(Request $request)
{
    // Obtenemos la tarea enviada desde el formulario
    $newTask = $request->input('task');

    // Aquí podríamos guardarla en una base de datos, etc.
    return redirect()->route('tasks.index')->with('success', 'Tarea añadida!');
}

Resumen

✅ Controlador → Vista:

  • El controlador pasa datos con return view('vista', ['clave' => $valor]).

  • La vista los recibe como variables (ej: $tasks).

✅ Vista → Controlador:

  • La vista envía datos mediante un formulario (POST/GET).

  • El controlador los recibe con $request->input('nombre_campo').

¡Así de fácil! 😊 Con esto ya puedes enviar y recibir datos básicos en Laravel.

Herencia de Layouts en Blade (Laravel)

En Laravel, Blade permite crear layouts (plantillas base) que pueden ser extendidos por otras vistas, evitando repetir código HTML. Usaremos el mismo ejemplo de tareas para mostrar cómo funciona.

Estructura básica de herencia

  1. Layout (plantilla base): Contiene la estructura HTML común

  2. Vista que extiende: Usa el layout y define los contenidos específicos

Ejemplo con el sistema de tareas

1. Crear el Layout (resources/views/layouts/app.blade.php)

html
<!DOCTYPE html>
<html>
<head>
    <title>@yield('title') - App Tareas</title>
</head>
<body>
    <div class="container">
        @yield('content')
    </div>
</body>
</html>

2. Modificar la vista de tareas para que herede del layout (resources/views/tareas/index.blade.php)

html
@extends('layouts.app')

@section('title', 'Lista de Tareas')

@section('content')
    <h1>Lista de Tareas</h1>
    
    <form method="POST" action="{{ route('tareas.store') }}">
        @csrf
        <input type="text" name="nombre" placeholder="Nueva tarea" required>
        <button type="submit">Agregar</button>
    </form>

    <ul>
        @foreach($tareas as $tarea)
            <li>{{ $tarea->nombre }}</li>
        @endforeach
    </ul>
@endsection

Cómo funciona la herencia

  1. @extends('layouts.app') indica que esta vista usará el layout app.blade.php

  2. @section('title') define el contenido para la sección "title" del layout

  3. @section('content') define el contenido para la sección "content" del layout

  4. En el layout:

    • @yield('title') será reemplazado por "Lista de Tareas - App Tareas"

    • @yield('content') será reemplazado por todo el contenido de la vista de tareas

Ventajas de usar layouts

  1. Evita duplicación de código: El HTML base (doctype, head, etc.) está en un solo lugar

  2. Fácil mantenimiento: Cambios en la estructura general solo se hacen en el layout

  3. Consistencia: Todas las páginas comparten la misma estructura base

  4. Organización: Las vistas se enfocan solo en su contenido específico

Puedes crear múltiples secciones en tu layout (@yield('scripts')@yield('styles'), etc.) y definirlas en las vistas hijas cuando sea necesario.

El resto del código (rutas, controlador y modelo) permanece exactamente igual que en el ejemplo anterior, ya que la herencia de layouts es un concepto que solo afecta a las vistas.

Componentes en Blade con Slots (Laravel)

Los componentes en Blade permiten crear elementos reutilizables. Los slots son espacios dentro del componente que pueden ser llenados con contenido personalizado cuando se usa el componente. Vamos a adaptar nuestro ejemplo de tareas.

1. Crear un componente simple (card)

Componente (resources/views/components/card.blade.php)

html
<div style="border: 1px solid #ccc; padding: 10px; margin: 10px;">
    <h2>{{ $title }}</h2>
    
    <div class="content">
        {{ $slot }}
    </div>
    
    @isset($footer)
        <div class="footer">
            {{ $footer }}
        </div>
    @endisset
</div>

2. Modificar la vista para usar componentes

Vista actualizada (resources/views/tareas/index.blade.php)

html
@extends('layouts.app')

@section('title', 'Lista de Tareas')

@section('content')
    <x-card title="Gestión de Tareas">
        <form method="POST" action="{{ route('tareas.store') }}">
            @csrf
            <input type="text" name="nombre" placeholder="Nueva tarea" required>
            <button type="submit">Agregar</button>
        </form>

        <ul>
            @foreach($tareas as $tarea)
                <li>{{ $tarea->nombre }}</li>
            @endforeach
        </ul>

        <x-slot name="footer">
            Total: {{ count($tareas) }} tareas
        </x-slot>
    </x-card>
@endsection

Explicación de los elementos

  1. Componente principal (<x-card>)

    • Se llama con title como atributo

    • El contenido entre las etiquetas va al $slot principal

  2. Slot principal ($slot)

    • Recibe todo el contenido interno automáticamente

    • En nuestro caso: el formulario y la lista

  3. Slot con nombre (footer)

    • Definido con <x-slot name="footer">

    • Opcional (se verifica con @isset en el componente)

Tipos de slots

TipoDescripciónEjemplo
Slot principalContenido por defecto{{ $slot }}
Slot con nombreContenido específico{{ $footer }}
Slot con atributosDatos adicionales{{ $user->name }}

Beneficios de usar componentes

  1. Reutilización: Puedes usar el componente card en cualquier vista

  2. Consistencia: Mantiene el mismo estilo en toda la aplicación

  3. Organización: Separa la lógica de presentación

  4. Flexibilidad: Permite contenido dinámico con slots

Los componentes pueden ser aún más potentes cuando se combinan con:

  • Props (atributos)

  • Clases condicionales

  • Slots con datos

  • Componentes anónimos

El resto de la aplicación (rutas, controlador, modelo) sigue exactamente igual que en los ejemplos anteriores.



Comentarios

Entradas más populares de este blog

8-Creación de una API RESTful con Laravel

02 -Rutas en Laravel

3-Rutas