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:

