Basta de escribir "espaguetis": por qué los patrones arquitectónicos en PHP son imprescindibles
\n\n¿Alguna vez has abierto un proyecto PHP antiguo y has sentido un escalofrío recorriendo tu espalda? Cuando en un solo archivo index.php se mezclan consultas SQL, maquetación HTML, lógica de negocio y oraciones a los dioses antiguos? Si es así, te has enfrentado a la falta de arquitectura. O, peor aún, al caos arquitectónico.
Hoy hablaremos de cómo los patrones arquitectónicos en PHP transforman tu código de un montón de ladrillos a un edificio sólido. Esto no es teoría para seniors con 10 años de experiencia. Son herramientas que salvarán tu sueño y el presupuesto del proyecto. Analizaremos 4 patrones clave: MVC, Active Record, Repository y Dependency Injection. ¡Allá vamos!
\n\nMVC (Model-View-Controller): el fundamento de cualquier framework
\n\nSi has trabajado con Laravel, Symfony o Yii2, ya has visto MVC. No es solo una abreviatura, sino una forma de dividir el código en tres áreas de responsabilidad:
\n\n- \n
- Model — datos y lógica de negocio (trabajo con BD, validación). \n
- View — visualización (HTML, plantillas). \n
- Controller — procesamiento de solicitudes (enlace de conexión). \n
Así es como se ve en PHP puro (sin framework):
\n\n<?php\n// UserController.php\nclass UserController {\n public function show(int $id): void {\n $userModel = new UserModel();\n $user = $userModel->findById($id); // Model\n \n // View\n include 'views/user_profile.php';\n }\n}\n\n// UserModel.php\nclass UserModel {\n public function findById(int $id): ?array {\n $stmt = $pdo->prepare("SELECT * FROM users WHERE id = ?");\n $stmt->execute([$id]);\n return $stmt->fetch() ?: null;\n }\n}\n\n// views/user_profile.php\n<h1><?= htmlspecialchars($user['name']) ?></h1>\n\nCuándo aplicarlo: Siempre que tengas más de 2 páginas. MVC es la base. Proporciona separación de la lógica, simplifica las pruebas y el mantenimiento.
\n\nTruco: No escribas SQL directamente en la View. Esto mata toda la esencia del patrón. Usa plantillas preparadas (Twig, Blade) — escapan automáticamente la salida, protegiendo contra XSS.
\n\nActive Record: simplicidad por la que se paga con rendimiento
\n\nActive Record es cuando un objeto representa simultáneamente una fila en la BD y contiene métodos para trabajar con ella. Clásico: Eloquent en Laravel o ActiveRecord en Yii2.
\n\nEjemplo en PHP puro:
\n\n<?php\nclass User extends ActiveRecord {\n protected string $table = 'users';\n \n public static function findByName(string $name): ?self {\n return self::query()\n ->where('name', $name)\n ->first();\n }\n}\n\n// Uso\n$user = new User();\n$user->name = 'Iván';\n$user->email = 'ivan@example.com';\n$user->save(); // INSERT en BD\n\n$admin = User::findByName('Admin');\n$admin->role = 'superadmin';\n$admin->update();\n\nVentajas:
\n- \n
- Mínimo código para operaciones CRUD. \n
- Intuitivo para principiantes. \n
Desventajas:
\n- \n
- Viola el Principio de Responsabilidad Única (un objeto lo hace todo). \n
- Difícil de probar — el objeto está fuertemente acoplado a la BD. \n
- Escalabilidad deficiente para lógica compleja. \n
Conclusión: Active Record es una excelente opción para prototipos, proyectos pequeños y paneles de administración. Pero para aplicaciones empresariales, es mejor mirar hacia Repository.
\n\nRepository: abstracción sobre el almacenamiento de datos
\n\nRepository es una capa intermedia entre la lógica de negocio y la fuente de datos (BD, API, archivos). Dices: «Dame el usuario con