MVC con PHP – Manejo de Rutas y a2enmod rewrite en Apache

En la sesión anterior revisamos la arquitectura MVC y resolvimos un ejercicio bastante sencillo en PHP empleando este paradigma.

Ahora mejoraremos un poco este proyecto agregando el manejo de rutas y activaremos el mod rewrite de Apache, el cual, en ocasiones genera errores en el manejo de rutas que ocasiona que el estudiante y/o desarrollador asuma que tiene un error en su código, cuando en realidad solo se trata de una configuración en el servicio Apache de su servidor.

Empecemos con el código:

Archivo index.php

<?php
require_once "Controlador.php";

$controlador = new Controlador();
$ruta = isset($_GET['pagina']) ? $_GET['pagina'] : 'home';
$controlador->cargarPagina($ruta);
?>
  • Se captura el valor de página desde la URL.
  • Si no se proporciona una página, se asigna «home» por defecto.
  • Se crea una instancia del controlador y se le pasa la página solicitada.

Archivo Controlador.php

<?php
require_once "Modelo.php";
require_once "Vista.php";

class Controlador {
    public function cargarPagina($pagina) {
        $modelo = new Modelo();
        $vista = new Vista();
        
        $contenido = $modelo->obtenerContenido($pagina);
        if ($contenido === false) {
            $contenido = "<h1>Sitio web no encontrado</h1><p>La página solicitada no existe.</p>";
        }
        
        $vista->mostrar($contenido);
    }
}
?>
  • Se verifica si la página solicitada está en la lista de páginas permitidas.
  • Si es válida, obtiene los datos desde el modelo y carga la vista correspondiente.
  • Si la página no existe, se carga una vista de error.

Archivo Modelo.php

<?php
class Modelo {
    private $paginas = [
        "home" => "<h1>Bienvenido a la página de inicio</h1><p>Contenido de Home.</p>",
        "cliente" => "<h1>Clientes</h1><p>Información sobre nuestros clientes.</p>",
        "nosotros" => "<h1>Nosotros</h1><p>Sobre nuestra empresa.</p>",
    ];

    public function obtenerContenido($pagina) {
        return $this->paginas[$pagina] ?? false;
    }
}
?>
  • Cada clave representa una página y contiene el título y la descripción.

Archivo Vista.php

<?php
class Vista {
    public function mostrar($contenido) {
        echo "<html><head><title>Mi Sitio MVC</title></head><body>";
        echo $contenido;
        echo "</body></html>";
    }
}
?>
  • Si la página es «error», muestra un mensaje de error.
  • Si la página existe, muestra su contenido.

Configurar Apache

Necesitamos que Apache pueda manejar (redirigir) correctamente las rutas, para lo cual se requiere:

Habilitar mod_rewrite en Apache

sudo a2enmod rewrite
sudo systemctl restart apache2

Activar AllowOverride All en Apache

sudo nano /etc/apache2/apache2.conf

<Directory /var/www/>
    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted
</Directory>

Cambia AllowOverride None por AllowOverride All

Crear un archivo .htaccess

En la misma carpeta donde está index.php, crea un archivo llamado .htaccess con el siguiente contenido:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php?pagina=$1 [QSA,L]

Finalmente reiniciar Apache

sudo systemctl restart apache2

Eso es todo, verificar el correcto funcionamiento del proyecto: