Por qué la arquitectura lo decide todo (y tu café ya no se enfriará)
\nImagina que estás construyendo una casa. Puedes amontonar ladrillos al azar, pegarlos con chicle y esperar que aguante hasta el invierno. O puedes diseñar los cimientos, las paredes y el techo para que la casa resista tanto un huracán como una invasión de familiares. En el mundo de PHP ocurre exactamente lo mismo. Los patrones arquitectónicos son esos planos que transforman tu código de «funciona y ya» a «funciona, escala y no te dan ganas de renunciar».
\nCuando empecé a programar en PHP, mis proyectos eran monstruos monolíticos. En un solo archivo index.php convivían consultas SQL, maquetación HTML y lógica de negocio. Funcionaba perfectamente... hasta que el cliente pedía añadir una nueva funcionalidad. Luego llegaba el infierno. Hoy te voy a mostrar cómo evitar ese infierno. Analizaremos los patrones arquitectónicos clave en PHP, desde los clásicos hasta los enfoques modernos. ¡Allá vamos!
MVC (Modelo-Vista-Controlador): el abuelo de todos los patrones
\nSi has trabajado con Laravel, Symfony o Yii2, ya te has topado con MVC. Es el patrón arquitectónico básico de PHP que divide la aplicación en tres partes:
\n- \n
- Modelo — datos y lógica de negocio (trabajo con BD, validación, cálculos). \n
- Vista — presentación (HTML, plantillas, JSON). \n
- Controlador — el puente: recibe la petición, llama al Modelo y pasa los datos a la Vista. \n
MVC resuelve el problema principal: la separación de responsabilidades. Se acabó el SQL dentro del HTML. El código se vuelve legible, testeable y mantenible.
\n\nEjemplo de MVC en PHP puro
\n// Modelo: User.php\nclass User {\n public function find(int $id): ?array {\n $pdo = new PDO('mysql:host=localhost;dbname=test', 'root', '');\n $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');\n $stmt->execute([$id]);\n return $stmt->fetch() ?: null;\n }\n}\n\n// Controlador: UserController.php\nclass UserController {\n public function show(int $id): void {\n $userModel = new User();\n $user = $userModel->find($id);\n if (!$user) {\n http_response_code(404);\n echo 'Usuario no encontrado';\n return;\n }\n // Pasamos los datos a la Vista\n require 'views/user.php';\n }\n}\n\n// Vista: views/user.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n<p>Email: <?= htmlspecialchars($user['email']) ?></p>\n¿Cuándo usarlo? Para aplicaciones web de complejidad media. Si tienes un blog sencillo o una tienda online, MVC es tu mejor opción. Pero ojo: si los controladores se vuelven demasiado grandes (Fat Controllers), el patrón pierde su sentido.
\n\nActive Record: simplicidad y velocidad
\nEl patrón Active Record hace que un objeto represente tanto una fila de la base de datos como la lógica de negocio. ¿Recuerdas Laravel Eloquent o Yii2 ActiveRecord? Pues eso es. Cada modelo es a la vez una consulta a la BD, reglas de validación y relaciones.
\n\nEjemplo de Active Record (estilo Eloquent)
\nclass User extends ActiveRecord {\n // Las propiedades corresponden a las columnas de la tabla\n public int $id;\n public string $name;\n public string $email;\n\n public function save(): bool {\n // Lógica de INSERT/UPDATE\n if ($this->id) {\n // UPDATE\n } else {\n // INSERT\n }\n return true;\n }\n\n public static function find(int $id): ?self {\n // SELECT * FROM users WHERE id = $id\n }\n}\n\n// Uso\n$user = new User();\n$user->name = 'Juan';\n$user->email = 'juan@ejemplo.com';\n$user->save(); // Sencillo y claro\nVentajas: se escribe rápido y es intuitivo para principiantes. Desventajas: viola el principio de responsabilidad única (Single Responsibility de SOLID). El modelo sabe tanto de los datos como de cómo guardarlos. Para proyectos complejos, puede volverse un problema.