MI PRIMER MVC
TUTORIAL SUPER SENCILLO: "MI PRIMER MVC"
馃幆 ¿Qu茅 es MVC?
Imagina un restaurante:
Modelo = La cocina (donde est谩n los ingredientes)
Vista = El men煤 y la mesa (lo que ve el cliente)
Controlador = El mesero (conecta al cliente con la cocina)
馃摑 Paso a Paso de Nuestro C贸digo:
PASO 1: El MODELO (La Cocina)
class UsuarioModelo {
public function obtenerUsuario() {
return "Sa煤l Sotelo"; // El ingrediente (dato)
}
}✅ El modelo solo guarda y obtiene datos. No sabe c贸mo mostrarlos.
PASO 2: El CONTROLADOR (El Mesero)
class UsuarioControlador {
private $modelo; // El mesero conoce la cocina
public function __construct() {
$this->modelo = new UsuarioModelo(); // Conecta con la cocina
}
public function mostrarUsuario() {
return $this->modelo->obtenerUsuario(); // Pide el dato a la cocina
}
}✅ El controlador conecta todo. Le pide datos al modelo y se los da a la vista.
PASO 3: La VISTA (El Cliente ve la mesa)
<?php
$jefe = new UsuarioControlador(); // Llamar al mesero
$nombre = $jefe->mostrarUsuario(); // Pedirle el dato
echo $nombre; // Ver el dato en la mesa
?>✅ La vista solo muestra. Usa PHP para mostrar lo que el controlador le da.
馃攧 El Flujo Completo:
1. El usuario abre la p谩gina (VISTA)
2. La vista crea un controlador: $jefe = new UsuarioControlador()
3. El controlador crea un modelo en su constructor
4. La vista pide datos: $jefe->mostrarUsuario()
5. El controlador pide al modelo: $this->modelo->obtenerUsuario()
6. El modelo devuelve el dato
7. El controlador devuelve el dato a la vista
8. La vista muestra: <?php echo $nombre; ?>⭐ Ejercicios para Practicar:
Agrega m谩s datos: Modifica el modelo para tener apellido, email, etc.
Agrega m茅todos: Crea en el modelo
obtenerEmail()y mu茅stralo.Haz una lista: Cambia el modelo para devolver un array de usuarios.
馃帹 Ejemplo de Lista (para practicar):
// En el MODELO
public function obtenerTodos() {
return ["Ana", "Carlos", "Mar铆a", "Sa煤l"];
}
// En el CONTROLADOR
public function mostrarTodos() {
return $this->modelo->obtenerTodos();
}
// En la VISTA
$usuarios = $jefe->mostrarTodos();
foreach($usuarios as $usuario) {
echo "<li>$usuario</li>";
}馃挕 Tips Importantes:
El modelo NO sabe que existe el controlador
El controlador conecta todo
La vista SOLO muestra, no calcula
Usa nombres claros: UsuarioModelo, UsuarioControlador
Te ayudo a crear un tutorial super sencillo para entender MVC. Primero, corrijo el c贸digo y luego te explico paso a paso:
馃搧 C贸digo Corregido (todo en un archivo)
<?php
// =============================================
// MODELO - Maneja los datos
// =============================================
class UsuarioModelo {
// Obtener un usuario
public function obtenerUsuario() {
$usuario = "Sa煤l Sotelo";
return $usuario;
}
// M茅todo adicional para practicar
public function obtenerEdad() {
return 25;
}
}
// =============================================
// CONTROLADOR - Conecta Modelo y Vista
// =============================================
class UsuarioControlador {
private $modelo; // Propiedad para guardar el modelo
// Constructor: se ejecuta autom谩licamente al crear el objeto
public function __construct() {
$this->modelo = new UsuarioModelo(); // Crear instancia del modelo
}
// M茅todo para obtener usuario
public function mostrarUsuario() {
$usuario = $this->modelo->obtenerUsuario(); // Usar el modelo
return $usuario;
}
// M茅todo para obtener edad
public function mostrarEdad() {
return $this->modelo->obtenerEdad();
}
}
// =============================================
// VISTA - HTML con PHP
// =============================================
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi primer MVC</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.tarjeta {
background: #f8f9fa;
border-radius: 10px;
padding: 20px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<div class="container mt-5">
<div class="row">
<div class="col-md-6 mx-auto">
<div class="tarjeta">
<h1 class="text-center text-primary mb-4">馃幆 Mi Primer MVC</h1>
<?php
// 1. Crear controlador (el "jefe" que organiza todo)
$jefe = new UsuarioControlador();
// 2. Pedir datos al controlador
$nombre = $jefe->mostrarUsuario();
$edad = $jefe->mostrarEdad();
?>
<!-- 3. Mostrar los datos -->
<div class="text-center">
<h3>馃搶 Datos del Usuario</h3>
<p class="display-6"><?php echo $nombre; ?></p>
<p class="lead">Edad: <?php echo $edad; ?> a帽os</p>
<div class="alert alert-info mt-4">
<strong>¿C贸mo funciona?</strong><br>
Vista → Controlador → Modelo → Controlador → Vista
</div>
</div>
<!-- Botones de ejemplo -->
<div class="d-flex justify-content-center gap-2 mt-4">
<button class="btn btn-primary" onclick="location.reload()">
馃攧 Actualizar
</button>
<a href="#" class="btn btn-outline-secondary">
馃摑 Editar
</a>
</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>
¿Constructor s铆 o constructor no?
Sin constructor (tu ejemplo):
class ControladorUsuarios {
public function ctrObtenerUsuarios() {
return ModeloUsuarios::obtenerUsuarios(); // Llamada est谩tica
}
}✅ M谩s simple de entender
✅ Menos c贸digo
✅ Ideal para empezar
Con constructor (mi ejemplo anterior):
class UsuarioControlador {
private $modelo;
public function __construct() {
$this->modelo = new UsuarioModelo(); // Crear modelo
}
}✅ Mejor para proyectos grandes
✅ M谩s flexible
✅ Sigue mejores pr谩cticas
Aqu铆 tienes el primer ejercicio simplificado SIN CONSTRUCTOR:
<?php
// =============================================
// MODELO - Datos de usuarios
// =============================================
class UsuarioModelo {
// M茅todo est谩tico - f谩cil de llamar sin crear objeto del modelo
public static function obtenerUsuario() {
return "Sa煤l Sotelo";
}
public static function obtenerEdad() {
return 25;
}
}
// =============================================
// CONTROLADOR - Conecta modelo y vista
// =============================================
class UsuarioControlador {
// M茅todos que llaman directamente al modelo (sin constructor)
public function mostrarUsuario() {
return UsuarioModelo::obtenerUsuario(); // Llamada est谩tica
}
public function mostrarEdad() {
return UsuarioModelo::obtenerEdad(); // Llamada est谩tica
}
}
// =============================================
// VISTA - HTML con PHP
// =============================================
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Mi primer MVC (sin constructor)</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<style>
.tarjeta-simple {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 15px;
padding: 30px;
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
}
.explicacion {
background: #f8f9fa;
border-left: 4px solid #28a745;
padding: 15px;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="container mt-5">
<div class="row">
<div class="col-md-8 mx-auto">
<!-- Tarjeta Principal -->
<div class="tarjeta-simple text-center">
<h1 class="mb-4">馃幆 MVC S脷PER SIMPLE</h1>
<h2 class="display-4">馃懁 Datos del Usuario</h2>
<?php
// PASO 1: Crear el controlador (el "jefe")
$controlador = new UsuarioControlador();
// PASO 2: Pedir datos al controlador (sin constructor)
$nombre = $controlador->mostrarUsuario();
$edad = $controlador->mostrarEdad();
?>
<!-- PASO 3: Mostrar los datos -->
<div class="mt-4">
<p class="display-6"><?php echo $nombre; ?></p>
<p class="lead">Edad: <?php echo $edad; ?> a帽os</p>
<!-- Decoraci贸n -->
<div class="mt-3">
<span class="badge bg-light text-dark p-2">Modelo</span>
<span class="text-white mx-2">→</span>
<span class="badge bg-light text-dark p-2">Controlador</span>
<span class="text-white mx-2">→</span>
<span class="badge bg-light text-dark p-2">Vista</span>
</div>
</div>
</div>
<!-- Explicaci贸n Simple -->
<div class="explicacion mt-4">
<h4 class="text-success">✅ As铆 funciona (sin constructor):</h4>
<ol class="list-group list-group-flush bg-transparent">
<li class="list-group-item bg-transparent">
<strong>1. El Modelo</strong> guarda el dato: "Sa煤l Sotelo"
</li>
<li class="list-group-item bg-transparent">
<strong>2. El Controlador</strong> lo pide: <code>UsuarioModelo::obtenerUsuario()</code>
</li>
<li class="list-group-item bg-transparent">
<strong>3. La Vista</strong> lo muestra: <code><?php echo $nombre; ?></code>
</li>
</ol>
</div>
<!-- C贸digo explicado -->
<div class="row mt-4">
<div class="col-md-6">
<div class="card">
<div class="card-header bg-primary text-white">
馃搧 MODELO (Datos)
</div>
<div class="card-body">
<pre class="mb-0"><code>class UsuarioModelo {
// static = se usa sin crear objeto
static function obtenerUsuario() {
return "Sa煤l Sotelo";
}
}</code></pre>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card">
<div class="card-header bg-success text-white">
馃幃 CONTROLADOR (Conexi贸n)
</div>
<div class="card-body">
<pre class="mb-0"><code>class UsuarioControlador {
function mostrarUsuario() {
// Llama directo al modelo
return UsuarioModelo::obtenerUsuario();
}
}</code></pre>
</div>
</div>
</div>
</div>
<!-- Botones de acci贸n -->
<div class="text-center mt-4">
<a href="#" class="btn btn-primary btn-lg" onclick="location.reload()">
馃攧 Actualizar
</a>
<a href="#" class="btn btn-outline-secondary btn-lg">
馃搵 Ver c贸digo
</a>
</div>
<!-- Mensaje clave -->
<div class="alert alert-success mt-4 text-center">
<strong>馃幆 ¡AS脥 DE SIMPLE!</strong><br>
El controlador llama al modelo con <code>::</code> (sin necesidad de constructor)
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html>馃摑 Las diferencias clave (para que lo expliques):
❌ Con constructor (m谩s complejo):
class Controlador {
private $modelo;
public function __construct() {
$this->modelo = new Modelo(); // Paso extra
}
public function mostrar() {
return $this->modelo->get(); // M谩s c贸digo
}
}✅ Sin constructor (m谩s simple):
class Controlador {
public function mostrar() {
return Modelo::get(); // Directo y claro
}
}馃幆 Para tus alumnos:
static significa "puedo usar esto sin crear un objeto"
:: se llama "operador de resoluci贸n de 谩mbito" (pero diles "dos puntos para llamar al modelo")
El controlador es solo un "traductor" entre los datos y lo que se ve
Comentarios
Publicar un comentario