MVC Master

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.