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:
User,Post,ProductCategory
// 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:
users,posts,product_categories
// En una migración
Schema::create('users', function (Blueprint $table) {
$table->id();
// ...
});3. Controladores
Singular con sufijo
Controllery en PascalCasePara recursos, puedes usar
NombreResourceControllerEjemplo:
UserController,PostController,ProductCategoryController
// 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
$user = User::find(1); // Una sola instancia de User6. Variables de Modelo (múltiples instancias)
Plural y en camelCase
Representa una colección de entidades/registros
Ejemplo:
$users,$posts,$productCategories
$users = User::all(); // Colección de usuariosEjemplo Completo
Modelo y Tabla:
// app/Models/Product.php
class Product extends Model
{
// ...
}
// Migración
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('product_name');
// ...
});Controlador:
// 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:
// 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
Ruta: Define la URL y qué controlador manejará la petición
Controlador: Recibe la petición, interactúa con el modelo y devuelve una vista
Modelo: Representa los datos y maneja la lógica de negocio con la base de datos
Vista: Muestra la información al usuario (HTML simple en este caso)
Ejemplo: Agregar una tarea
1. Ruta (routes/web.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
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
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)
<!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
El usuario visita
/tareas→ La ruta llama aTareaController@indexEl controlador pide todas las tareas al modelo (
Tarea::all())El modelo consulta la base de datos y devuelve los datos al controlador
El controlador pasa los datos a la vista (
view('tareas.index', compact('tareas')))La vista muestra el formulario y la lista de tareas
Cuando el usuario envía el formulario (POST a
/tareas):La ruta llama a
TareaController@storeEl 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
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)
<!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:
Mis Tareas
- Lavar los platos
- Hacer la compra
- Estudiar Laravel2. 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)
<!-- 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)
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)
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
Layout (plantilla base): Contiene la estructura HTML común
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)
<!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)
@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>
@endsectionCómo funciona la herencia
@extends('layouts.app')indica que esta vista usará el layoutapp.blade.php@section('title')define el contenido para la sección "title" del layout@section('content')define el contenido para la sección "content" del layoutEn 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
Evita duplicación de código: El HTML base (doctype, head, etc.) está en un solo lugar
Fácil mantenimiento: Cambios en la estructura general solo se hacen en el layout
Consistencia: Todas las páginas comparten la misma estructura base
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)
<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)
@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>
@endsectionExplicación de los elementos
Componente principal (
<x-card>)Se llama con
titlecomo atributoEl contenido entre las etiquetas va al
$slotprincipal
Slot principal (
$slot)Recibe todo el contenido interno automáticamente
En nuestro caso: el formulario y la lista
Slot con nombre (
footer)Definido con
<x-slot name="footer">Opcional (se verifica con
@isseten el componente)
Tipos de slots
| Tipo | Descripción | Ejemplo |
|---|---|---|
| Slot principal | Contenido por defecto | {{ $slot }} |
| Slot con nombre | Contenido específico | {{ $footer }} |
| Slot con atributos | Datos adicionales | {{ $user->name }} |
Beneficios de usar componentes
Reutilización: Puedes usar el componente card en cualquier vista
Consistencia: Mantiene el mismo estilo en toda la aplicación
Organización: Separa la lógica de presentación
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
Publicar un comentario