4.1 · Entender el patrón MVC

Nivel 4 · Frameworks & API

4.1Entender el patrón MVC

Objetivo: Entender el patrón MVC (separar datos, presentación, coordinación) y su flujo — la base de los frameworks web, para usarlos con criterio y estructurar correctamente vuestras aplicaciones.
Tiempo estimado: 11 min · lectura autónoma · Si solo tienes 5 min: lee «Lo esencial en 30s» + el esquema.

Lo esencial en 30 segundos

  • MVC = 3 responsabilidades separadas : el Modelo gestiona datos y lógica de negocio, la Vista muestra el HTML, el Controlador orquesta (petición → modelo → vista).
  • Flujo típico : petición → enrutamiento hacia el controlador adecuado → el controlador llama al modelo → el modelo devuelve los datos → el controlador elige la vista.
  • Reflejo de Riad : controladores ligeros, modelos ricos — nunca consultas SQL en las vistas, nunca lógica de negocio en la presentación.

Minicaso seguido — Riad ordena su catálogo en Constantine

Riad, desarrollador web en Constantine, mantiene el catálogo de una tienda local : su archivo mezcla consultas SQL, cálculos de precios y HTML, y cada cambio rompe otra cosa. Decide ordenar : un modelo que recupera los productos por categoría, un controlador que orquesta la página « productos », una vista que muestra la lista recibida. Cuando el cliente pide una nueva presentación, Riad solo toca la vista ; cuando cambia la regla de precios, solo toca el modelo. Primer hito del hilo : del PHP « desordenado » al PHP con arquitectura.

Este mismo caso vuelve en el curso, el esquema, el guion y el desafío 48h — y continúa en 4.2, 4.3, 4.4 y 4.5.

1. Las tres responsabilidades

El MVC (Modelo-Vista-Controlador) separa la aplicación en tres capas. El Modelo gestiona los DATOS y la LÓGICA DE NEGOCIO : acceso a la base, entidades (Producto, Usuario), reglas (precio con descuento, correo único) — independientemente de la presentación. La Vista gestiona la PRESENTACIÓN : HTML con inserciones mínimas (mostrar una variable, iterar una lista), sin lógica de negocio ni acceso a la base. El Controlador hace de ENLACE : recibe la petición, llama al modelo, prepara los datos y luego elige la vista. Como Riad, apuntamos a controladores « ligeros » y modelos « ricos ».

La regla de oro : cada fragmento de código tiene UN lugar evidente. ¿Dato o regla de negocio? Modelo. ¿HTML? Vista. ¿Coordinación petición → datos → presentación? Controlador. Esta claridad elimina el « código espagueti » donde todo está mezclado en un solo archivo.

2. El flujo de una petición y los beneficios

El flujo típico : (1) el usuario pide una URL ; (2) el enrutamiento dirige al CONTROLADOR adecuado y su método ; (3) el controlador llama al MODELO (p. ej. recuperar los productos) ; (4) el controlador pasa los datos a la VISTA ; (5) la vista genera el HTML. Riad sigue este camino para cada página en lugar de hacerlo todo en un solo script.

Los beneficios : claridad (sabemos dónde encontrar qué), mantenibilidad (cambiar la vista sin tocar los datos, y viceversa), reutilización y test (los mismos modelos sirven una página HTML o una API JSON), colaboración (cada uno trabaja en su capa). Es el patrón DOMINANTE de los frameworks (Laravel, Symfony) : carpetas Models, Controllers, vistas/plantillas y enrutamiento — entenderlo ANTES de un framework es usarlo con criterio en lugar de imitarlo a ciegas.

Error frecuente de interpretación: « El MVC es solo poner mis archivos en tres carpetas ». No. Mover código mezclado a tres carpetas sin separar las responsabilidades no cambia nada : si la vista hace consultas SQL y el controlador calcula los precios, sigue siendo espagueti — con etiquetas. El MVC es una disciplina de reparto (datos al modelo, presentación a la vista, coordinación al controlador), no un orden cosmético.
El flujo MVC de una petición Petición → controlador → modelo → vista Petición + enrutamiento URLdirigida al controlador adecuadoControlador Orquesta :llama al modeloModelo Datos + lógica denegocio (base, reglas)Vista Muestra el HTML conlos datos recibidos
Petición → controlador → modelo → vista
Versión en texto del esquema (SEO / lectores de pantalla / traducción): 1) Riad recibe una petición : el enrutamiento la dirige al controlador adecuado. 2) El controlador llama al modelo para recuperar o tratar los datos. 3) El modelo aplica las reglas de negocio y devuelve datos listos. 4) El controlador elige la vista y le pasa los datos. Lección : separar datos, presentación y coordinación hace la aplicación clara, mantenible y testeable.

🔎 Ejemplo concreto — 🔎 Ejemplo concreto — La lista de productos en MVC

El reparto de Riad para la página del catálogo :

Modelo      → Produit::recupererParCategorie($cat) // SQL + reglas aquí
Controlador → $produits = Produit::recupererParCategorie($cat);
               afficherVue('liste', ['produits' => $produits]);
Vista       → foreach ($produits as $p) { mostrar $p['nom'], $p['prix'] }
Regla       → cambiar la presentación = tocar solo la vista

Lectura : tres bloques, tres roles, un solo sentido de circulación.

Lección : la vista recibe datos listos, no los fabrica.

Vocabulario de la sección

MVC (Modelo-Vista-Controlador)
Patrón de arquitectura que separa la aplicación en tres responsabilidades : Modelo (datos/lógica de negocio), Vista (presentación), Controlador (coordinación). La base de los frameworks web.

Ejemplo sencillo: Riad ordena su catálogo : modelo para los productos, vista para el HTML, controlador para orquestar.

Lo que no es: un único script mezclando SQL, cálculos y HTML.

Reflejo: para cada línea de código, preguntar : ¿dato, presentación o coordinación?

Modelo (Model)
Gestiona los DATOS y la LÓGICA DE NEGOCIO : acceso a la base, entidades, reglas — independientemente de la presentación.

Ejemplo sencillo: El modelo Producto de Riad recupera los productos y calcula el precio con descuento.

Lo que no es: una consulta SQL escrita en una plantilla de presentación.

Reflejo: toda regla de negocio vive en el modelo, testeable sin HTML.

Vista (View)
Gestiona la PRESENTACIÓN : el HTML, lo que ve el usuario ; recibe datos preparados y los presenta.

Ejemplo sencillo: La vista lista de Riad itera los productos recibidos y los muestra escapados.

Lo que no es: una plantilla que consulta la base o aplica descuentos.

Reflejo: vista « simple » : mostrar, iterar, condición simple — nada más.

Controlador (Controller)
Hace de ENLACE : recibe la petición, llama al modelo, elige la vista con los datos ; orquesta, ligero y legible.

Ejemplo sencillo: El controlador catálogo de Riad recupera los productos y luego muestra la vista lista.

Lo que no es: un controlador de 300 líneas que hace SQL + cálculos + HTML.

Reflejo: controlador ligero : coordinar, delegar, mostrar.

Enrutamiento / flujo MVC
El enrutamiento dirige la petición al controlador adecuado ; flujo : petición → enrutamiento → controlador → modelo → vista.

Ejemplo sencillo: La URL /produits de Riad llega al controlador catálogo, método index.

Lo que no es: un archivo por URL sin coordinación central.

Reflejo: seguir el flujo en cada depuración : ¿dónde se rompe la cadena?

En la práctica — En la práctica — Entender y aplicar el MVC

  1. Identificad las tres responsabilidades : Modelo (datos/lógica), Vista (presentación HTML), Controlador (coordinación) — y por qué separarlas.
  2. Seguid el flujo de una petición : petición → enrutamiento → controlador → modelo (datos) → vista (presentación).
  3. En un pequeño ejemplo (la lista de productos de Riad), repartid el código : modelo que recupera, controlador que llama, vista que muestra.
  4. Constatad los beneficios : cambiad la vista sin tocar el modelo, y viceversa — claridad, mantenibilidad, test.
Entendéis el patrón MVC (separar datos, presentación, coordinación) y su flujo — la base de los frameworks, que estructura correctamente vuestras aplicaciones.

Guion listo para decir — explicar su orden MVC (30 s)

« Soy Riad : saqué las consultas y las reglas de precios al modelo, el HTML a la vista, y el controlador solo orquesta — petición, modelo, vista. Resultado : cambio la presentación sin tocar los datos, y puedo probar la lógica sin navegador. »

Para decir en revisión de código ; mostrad los tres archivos lado a lado.

Modelo copiar-pegar — mini-MVC en PHP puro (código probado)

prepare('SELECT nom, prix FROM produits WHERE categorie = :cat');
        $stmt->execute(['cat' => $cat]);
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }
    public static function prixRemise(float $prix, float $taux): float {
        return round($prix * (1 - $taux), 2);
    }
}

// --- Controlador : ligero, solo orquesta ---
function indexCatalogue(PDO $pdo, string $cat): void {
    $produits = Produit::recupererParCategorie($pdo, $cat);
    afficherVue('liste', ['produits' => $produits]); // elige la vista
}

// --- Vista : simple, solo muestra (datos ya listos, escapados) ---
function afficherVue(string $nom, array $vars): void {
    $produits = $vars['produits'];
    foreach ($produits as $p) {
        echo '
  • ' . htmlspecialchars($p['nom']) . ' — ' . htmlspecialchars((string) $p['prix']) . ' DA
  • '; } }

    Pequeño script personal

    Una separación ligera (3 funciones o 3 archivos) basta, pero mantened la disciplina : ninguna consulta en la presentación.

    Proyecto de equipo

    Como Riad : carpetas models/, controllers/, views/ — cada uno sabe dónde trabajar sin conflictos.

    Mismos modelos, dos salidas

    Reutilizad el modelo para una página HTML y para una API JSON : solo cambia la vista.

    Antes de un framework

    Practicad este reparto en PHP puro : Laravel y Symfony resultarán evidentes en lugar de mágicos.

    Prudencia: Un buen reparto no excusa ningún fallo : consultas preparadas en los modelos y escape en las vistas (ver nivel 3), incluso cuando el código está bien ordenado. Contenido pedagógico, ejemplos con datos ficticios.

    ✓ Buenas prácticas

    • Separar los 3 roles : datos, presentación, coordinación.
    • Apuntar a controladores ligeros y modelos ricos.
    • Entender el MVC antes de abordar un framework.

    ✗ Errores frecuentes

    • Poner consultas SQL en las vistas.
    • Poner la lógica de negocio en los controladores.
    • Reproducir espagueti DENTRO del framework.

    Puntos clave

    • MVC = 3 responsabilidades : MODELO (datos + lógica de negocio), VISTA (presentación HTML), CONTROLADOR (coordinación petición → modelo → vista).
    • FLUJO : petición → ENRUTAMIENTO (controlador adecuado) → CONTROLADOR → MODELO (datos) → VISTA (presentación).
    • BENEFICIOS : claridad, mantenibilidad, reutilización/test, colaboración.
    • Entender el MVC ANTES de un framework = usarlo con criterio. Paso del PHP « desordenado » al PHP CON ARQUITECTURA.

    Desafío 48h — aplicad mañana

    Tomad 1 página mezclada y divididla en modelo + controlador + vista : el modelo recupera, el controlador orquesta, la vista muestra.

    Lista de salida de la sección
    • Puedo citar las 3 capas y sus roles.
    • Sé seguir el flujo de una petición.
    • He dividido 1 página en MVC limpio.
    Autoevaluación 1-5 : ¿mis vistas están sin lógica de negocio?¿mis controladores siguen ligeros y legibles?

    Preguntas frecuentes

    ¿Por qué entender el MVC antes de aprender directamente un framework?

    Porque los frameworks imponen una estructura MVC (carpetas Models, Controllers, vistas, enrutamiento) : sin entender el PORQUÉ, imitamos los tutoriales sin saber dónde poner qué, mezclamos las responsabilidades DENTRO del framework, y nos perdemos en cuanto salimos del caso del tutorial. Con el MVC entendido, la estructura resulta evidente, respetamos la separación (beneficios preservados), depuramos siguiendo el flujo, y los conceptos se transfieren (Laravel, Symfony y más allá).

    ¿Cómo repartir concretamente el código — y qué errores evitar?

    Modelo : acceso a la base (CRUD), entidades, reglas de negocio — independiente de la presentación. Vista : HTML + inserciones mínimas de datos ya preparados (bucle, presentación escapada), nunca SQL ni reglas. Controlador : recibe la petición, llama al modelo, elige la vista — orquesta, ligero. Errores clásicos : consultas en las vistas, lógica de negocio en los controladores, controladores de 300 líneas. Vistas « simples », modelos « ricos », controladores « ligeros ».

    Comprueba tu comprensión

    ¿Dónde colocar la lógica de negocio y el acceso a la base?

    Recursos adicionales (opcional, para ir más allá)

    Examen del nivel 4Preguntas inéditas y más difíciles para validar tus conocimientos