Módulo 2: Motor MVC y Abstracción (POO)
Ahora crearemos el cerebro del proyecto MVC. Escribiremos un Front Controller Universal (index.php) apoyado por .htaccess, y dotaremos a todos los Modelos con una herencia abstracta (ModeloBase) para omitir cientos de líneas repetidas.
1. El FronController Maestro (.htaccess & index.php)
A los sistemas Pro no se accede por midominio.com/estudiantes.php?operacion=borrar. Se entra por una única puerta index.php con una URL Hermosa /estudiantes/borrar.
/.htaccess (Raíz)RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
/index.php (Raíz)<?php
session_start();
// Este es el router puro. Invoca clases Controlador libremente.
// Si URL es '/estudiantes' => cargar EstudianteController->index()
$url = $_SERVER['REQUEST_URI'];
if (strpos($url, '/estudiantes/eliminar') !== false) {
(new \App\Controllers\EstudianteController())->eliminar();
}
// [Y asi todo el ruteador...]
2. La Clase Padre Pura (ModeloBase)
¡Atención! Todos los modulos necesitan Hacer Listados Totales (SELECT * FROM), y eliminar usuarios. ¿Vamos a escribir el método de eliminar para 4 archivos distintos? ¡No! Los creamos en una clase abstracta padre y todo el proyecto lo hereda mágicamente.
app/Core/ModeloBase.php<?php
namespace App\Core;
use App\Core\Database;
abstract class ModeloBase {
protected $db;
protected $tabla; // Será llenado por los Hijos automaticamente
public function __construct() {
$this->db = Database::getInstance();
}
/* ¡EL CRUD UNIVERSAL (CUIDA A PROFES, ESTUDIANTES Y CURSOS POR IGUAL)! */
public function all() {
$stmt = $this->db->query("SELECT * FROM {$this->tabla}");
return $stmt->fetchAll(\PDO::FETCH_OBJ);
}
public function buscarPorId($id) {
$stmt = $this->db->prepare("SELECT * FROM {$this->tabla} WHERE id = :idx");
$stmt->execute(['idx' => $id]);
return $stmt->fetch(\PDO::FETCH_OBJ);
}
public function eliminar($id) {
$stmt = $this->db->prepare("DELETE FROM {$this->tabla} WHERE id = :idx");
return $stmt->execute(['idx' => $id]);
}
// Obliga al EstudianteModelo o ProfesorModelo a programar sus inserciones propias
abstract public function insertar();
}
Con esto, cada vez que creas el Modelo Estudiante o Curso, solo le dices protected $tabla = 'cursos'; ¡Y PUFFF! Hereda la forma de listarse y aniquilarse a sí mismo ahorrando 50,000 líneas de código WAMP.