php-el-patron-mvc-en-php

El patrón MVC en PHP

  • 3 min

MVC es un patrón arquitectónico que separa una aplicación en modelo, vista y controlador.

Hasta ahora, es muy probable que hayas escrito “Código Espagueti”: archivos donde mezclas la conexión a la base de datos, la lógica de negocio (if/else), y el HTML final, todo revuelto en el mismo fichero .php.

El patrón MVC llega para poner orden. Propone separar tu código en tres capas distintas, donde cada una tiene una única responsabilidad.

Los tres mosqueteros

Es el encargado de gestionar la información y la lógica de negocio.

  • Habla con la base de datos (SQL).
  • Valida reglas (ej: “¿Tiene saldo suficiente?”).
  • Importante: El Modelo NO sabe nada de HTML. Nunca hace un echo. Solo devuelve datos crudos (Arrays u Objetos).

Es lo que ve el usuario. Es código HTML mezclado con muy poco PHP (solo para mostrar variables).

  • Recibe datos y los pinta.
  • Importante: La Vista NO tiene lógica. No hace consultas SQL ni cálculos complejos. Es “tonta”.

Es el intermediario. El usuario nunca llama al Modelo ni a la Vista directamente; llama al Controlador.

  • Recibe la petición del usuario (Request).
  • Le pide los datos al Modelo.
  • Carga la Vista y le pasa los datos para que se muestren.

La analogía del restaurante

Para entenderlo mejor, imagina un restaurante:

Tú (Usuario): Llegas y pides un plato.

El Camarero (Controlador): Toma tu nota. Él no cocina ni cultiva las verduras. Solo coordina.

La Cocina (Modelo): El camarero lleva la comanda a la cocina. Allí el chef busca los ingredientes (Base de Datos), los cocina y prepara el plato. El chef no sabe quién se lo va a comer ni en qué mesa.

El Plato Emplatado (Vista): La comida se pone en un plato bonito.

Desenlace: El camarero (Controlador) recoge el plato (Vista) con la comida preparada (Datos del Modelo) y te lo sirve.

Ejemplo práctico en código

Vamos a ver cómo se separaría un script simple que muestra el perfil de un usuario.

A. El Modelo (src/Modelos/Usuario.php)

Solo se preocupa por los datos.

namespace MiApp\Modelos;

class Usuario {
    public function obtenerPorId($id) {
        // Simulamos una consulta a BD
        return [
            'nombre' => 'Ana Garcia',
            'email' => '[email protected]',
            'rol' => 'Admin'
        ];
    }
}
Copied!

B. La Vista (views/perfil.php)

Solo se preocupa de mostrar el HTML. No sabe de dónde vinieron los datos, solo sabe que existe una variable $datos.

<!DOCTYPE html>
<html>
<body>
    <h1>Perfil de Usuario</h1>
    <p>Nombre: <?= htmlspecialchars($datos['nombre']) ?></p>
    <p>Email: <?= htmlspecialchars($datos['email']) ?></p>
</body>
</html>
Copied!

C. El Controlador (src/Controladores/UsuarioController.php)

Conecta todo.

namespace MiApp\Controladores;
use MiApp\Modelos\Usuario;

class UsuarioController {
    
    public function mostrarPerfil($id) {
        // 1. Llama al modelo para pedir datos
        $modelo = new Usuario();
        $datos = $modelo->obtenerPorId($id);
        
        // 2. Carga la vista y le "pasa" los datos
        // (Al hacer require, la vista tendrá acceso a la variable $datos)
        require 'views/perfil.php';
    }
}
Copied!

¿Por qué complicarse tanto?

Al principio parece que escribes más archivos para hacer lo mismo, pero las ventajas son enormes:

  1. Mantenibilidad: Si quieres cambiar el diseño HTML (Vista), no tocas ni rompes la lógica de la base de datos (Modelo).
  2. Trabajo en Equipo: Un diseñador frontend puede trabajar en la Vista mientras el programador backend trabaja en el Modelo sin estorbarse.
  3. Reutilización: El mismo Modelo (función obtenerUsuario) puede usarse para mostrar el perfil en la web, en un PDF o enviarlo por API, porque no tiene HTML pegado.