Ejemplo S脷PER Simple sin constructor
馃搧 Ejemplo S脷PER Simple sin constructor
<?php
// =============================================
// MODELO - La nevera (guarda los datos)
// =============================================
class ModeloProductos {
// M茅todo est谩tico - no necesita crear objeto
public static function obtenerProductos() {
return [
["nombre" => "馃崕 Manzana", "precio" => 15, "stock" => 20],
["nombre" => "馃崒 Pl谩tano", "precio" => 12, "stock" => 15],
["nombre" => "馃崐 Naranja", "precio" => 18, "stock" => 8],
["nombre" => "馃 Aguacate", "precio" => 25, "stock" => 5]
];
}
// Otro m茅todo para practicar
public static function obtenerTotalProductos() {
return count(self::obtenerProductos());
}
}
// =============================================
// CONTROLADOR - El vendedor (conecta la nevera con el cliente)
// =============================================
class ControladorProductos {
// M茅todo para obtener productos
public function mostrarProductos() {
// Llama directamente al modelo (est谩tico)
return ModeloProductos::obtenerProductos();
}
// M茅todo para obtener el total
public function mostrarTotal() {
return ModeloProductos::obtenerTotalProductos();
}
// M茅todo para productos con poco stock
public function mostrarProductosCriticos() {
$todos = ModeloProductos::obtenerProductos();
$criticos = [];
foreach($todos as $producto) {
if($producto['stock'] < 10) {
$criticos[] = $producto;
}
}
return $criticos;
}
}
// =============================================
// VISTA - El mostrador (lo que ve el cliente)
// =============================================
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tiendita MVC</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.producto-card {
transition: transform 0.2s;
}
.producto-card:hover {
transform: translateY(-5px);
box-shadow: 0 4px 15px rgba(0,0,0,0.2);
}
.stock-bajo {
background-color: #ffecb3;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container mt-5">
<h1 class="text-center mb-4">馃洅 Mi Tiendita MVC</h1>
<?php
// PASO 1: Crear controlador (as铆 de simple)
$tienda = new ControladorProductos();
// PASO 2: Pedir datos al controlador
$productos = $tienda->mostrarProductos();
$total = $tienda->mostrarTotal();
$criticos = $tienda->mostrarProductosCriticos();
?>
<!-- Tarjeta de resumen -->
<div class="row mb-4">
<div class="col-md-4 mx-auto">
<div class="card text-center bg-primary text-white">
<div class="card-body">
<h3><?php echo $total; ?></h3>
<p>Total de Productos</p>
</div>
</div>
</div>
</div>
<!-- Productos con poco stock -->
<?php if(!empty($criticos)): ?>
<div class="alert alert-warning">
<strong>⚠️ Alerta:</strong> Hay <?php echo count($criticos); ?> productos con stock bajo
</div>
<?php endif; ?>
<!-- Tabla de productos -->
<div class="row">
<div class="col-12">
<div class="card">
<div class="card-header bg-success text-white">
<h5 class="mb-0">馃摝 Lista de Productos</h5>
</div>
<div class="card-body">
<table class="table table-bordered">
<thead class="table-dark">
<tr>
<th>Producto</th>
<th>Precio</th>
<th>Stock</th>
<th>Estado</th>
</tr>
</thead>
<tbody>
<?php foreach($productos as $producto):
$claseStock = $producto['stock'] < 10 ? 'table-warning' : '';
?>
<tr class="<?php echo $claseStock; ?>">
<td><?php echo $producto['nombre']; ?></td>
<td>$<?php echo $producto['precio']; ?></td>
<td><?php echo $producto['stock']; ?></td>
<td>
<?php if($producto['stock'] < 10): ?>
<span class="badge bg-warning text-dark">¡Reabastecer!</span>
<?php else: ?>
<span class="badge bg-success">Disponible</span>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
</div>
</div>
</div>
<!-- Explicaci贸n simple -->
<div class="row mt-4">
<div class="col-12">
<div class="card bg-light">
<div class="card-body">
<h5>馃幆 ¿C贸mo funciona?</h5>
<ol class="list-group list-group-numbered">
<li class="list-group-item">El <strong>Modelo</strong> tiene los datos (productos)</li>
<li class="list-group-item">El <strong>Controlador</strong> los pide: <code>$tienda->mostrarProductos()</code></li>
<li class="list-group-item">La <strong>Vista</strong> los muestra bonitos en tabla</li>
</ol>
<p class="mt-3 mb-0 text-muted">
<small>✅ No usamos constructor - m谩s simple para empezar</small>
</p>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>馃摑 Comparaci贸n R谩pida
| Con Constructor | Sin Constructor |
|---|---|
$this->modelo->metodo() | Modelo::metodo() |
| M谩s profesional | M谩s simple |
| Mejor para crecer | Ideal para aprender |
| El controlador "tiene un" modelo | El controlador "usa" el modelo |
馃挕 Tips para tus alumnos:
Primero entiendan el flujo (Vista → Controlador → Modelo)
Despu茅s aprendan sobre static (m茅todos que se llaman sin crear objeto)
M谩s adelante agreguen constructores (cuando vean inyecci贸n de dependencias)
馃幃 Mini Ejercicio para practicar:
// 1. Agreguen al MODELO:
public static function buscarProducto($nombre) {
$productos = self::obtenerProductos();
foreach($productos as $p) {
if(strpos($p['nombre'], $nombre) !== false) {
return $p;
}
}
return null;
}
// 2. Agreguen al CONTROLADOR:
public function buscarProducto($nombre) {
return ModeloProductos::buscarProducto($nombre);
}
// 3. Usen en la VISTA:
$resultado = $tienda->buscarProducto("Manzana");¿Te sirvi贸 esta explicaci贸n? ¡Los m茅todos est谩ticos son perfectos para empezar!
Comentarios
Publicar un comentario