15-Aplicando el Patrón MVC en PHP - Parte 3: Integrando el Modelo y Completando el Ciclo
En la Parte 2, logramos que nuestro controlador interpretara la variable action de la URL y le dijera a la plantilla qué módulo de contenido incluir. Pero, ¿quién tiene la lógica para decidir cómo se debe mostrar ese contenido? ¿Y si en lugar de archivos HTML estáticos, quisieramos mostrar datos de una base de datos?
La respuesta es el Modelo. Es la capa encargada de toda la lógica de negocio y el acceso a los datos. En esta parte, vamos a:
Entender el flujo completo de una petición en MVC.
Crear una clase Modelo que contenga la lógica para seleccionar la vista correcta.
Hacer que el Controlador se comunique con el Modelo para obtener la respuesta adecuada.
Refinar nuestro código para que sea más claro y profesional.
El Flujo Completo de una Petición
Imaginemos que un usuario hace clic en el enlace "Nosotros". Esto es lo que sucede en una aplicación MVC bien construida:
El Usuario (Navegador): Envía una petición a través de la URL:
index.php?action=nosotros.El Front Controller (
index.php): Es el único punto de entrada. Recibe la petición y llama al Controlador correspondiente.El Controlador (
controller.php): Recibe la petición, la procesa (por ejemplo, sanitiza la variableaction) y se la pasa al Modelo para que haga el trabajo pesado. Le dice: "Modelo, necesito la lógica para mostrar la página 'nosotros'".El Modelo (
model.php): Contiene la lógica. Aquí es donde se decide qué archivo incluir, o más adelante, cómo consultar una base de datos. El modelo procesa la petición y le devuelve una respuesta al controlador (ej. la ruta del archivo a incluir, o un array de datos).El Controlador (de nuevo): Recibe la respuesta del Modelo y se la pasa a la Vista (plantilla).
La Vista (
template.php): Toma la respuesta (por ejemplo, la ruta de un módulo) y la muestra al usuario.
Nuestro objetivo en esta parte es conectar los pasos 3, 4 y 5.
Paso 1: Preparando el Escenario
Antes de empezar a codificar, asegurémonos de que tenemos la estructura correcta.
index.php(Front Controller): Debe requerir tanto el controlador como el modelo, e invocar el método que muestra la plantilla.<?php // index.php require_once "controllers/controller.php"; require_once "models/model.php"; $mvc = new MvcController(); $mvc->plantilla(); // Llama al método que carga la plantilla ?>
views/modules/navegacion.php(Vista - Menú): Asegúrate de que todos los enlaces tengan la variableactioncon los valores correctos (inicio,nosotros,servicios,contactenos).<nav> <ul> <li><a href="index.php?action=inicio">Inicio</a></li> <li><a href="index.php?action=nosotros">Nosotros</a></li> <li><a href="index.php?action=servicios">Servicios</a></li> <li><a href="index.php?action=contactenos">Contáctenos</a></li> </ul> </nav>
views/template.php(Vista - Plantilla): Por ahora, tendrá una línea para mostrar el resultado de nuestro controlador (esto lo cambiaremos después).<!DOCTYPE html> <html> <head> <title>Mi Sitio MVC</title> </head> <body> <header><h1>LOGOTIPO</h1></header> <?php include "modules/navegacion.php"; ?> <section> <?php // Aquí llamaremos al controlador para que muestre el contenido $mvc = new MvcController(); $mvc->enlacesPaginasController(); ?> </section> </body> </html>
Paso 2: El Controlador Recibe la Petición (controller.php)
Ahora, vamos a modificar nuestro controller.php para que tenga un método que capture la variable action.
<?php // controllers/controller.php class MvcController { // --- BLOQUE 1: LLAMADA A LA PLANTILLA --- public function plantilla() { include "views/template.php"; } // --- BLOQUE 2: INTERACCIÓN DEL USUARIO --- public function enlacesPaginasController() { // 1. Recibir lo que el usuario envía a través de la URL (variable GET) if (isset($_GET["action"])) { $enlacesController = $_GET["action"]; } else { // Si no hay acción, mostramos 'inicio' por defecto $enlacesController = "inicio"; } // 2. Mostrar el resultado para verificar que funciona echo $enlacesController; } } ?>
¿Qué hemos hecho?
Hemos creado el método
enlacesPaginasController().Dentro de él, capturamos el valor de
$_GET["action"]y lo guardamos en$enlacesController. Usamosisset()para evitar errores si la variable no existe.Por ahora, solo hacemos un
echopara ver que recibimos "inicio", "nosotros", etc., en nuestra plantilla.
Si pruebas tu aplicación y haces clic en los enlaces, verás que en la sección <section> de la página aparece la palabra "inicio", "nosotros", etc. ¡El controlador ya está recibiendo la petición!
Paso 3: El Modelo Procesa la Lógica (models/model.php)
El controlador no debería tomar decisiones sobre qué archivo incluir. Esa es responsabilidad del Modelo. Vamos a crear la clase que hará este trabajo.
Crea el archivo models/model.php:
<?php // models/model.php class EnlacesPaginas { // Este método recibe el parámetro enviado desde el controlador public function enlacesPaginasModel($enlacesModel) { // Lógica: Si el valor coincide con el nombre de una página... if ($enlacesModel == "inicio" || $enlacesModel == "nosotros" || $enlacesModel == "servicios" || $enlacesModel == "contactenos") { // ... entonces, construimos la ruta al módulo correspondiente $modulo = "views/modules/" . $enlacesModel . ".php"; } // Devolvemos la ruta del módulo return $modulo; } } ?>
¿Qué hemos hecho aquí?
Hemos creado la clase
EnlacesPaginas.Definimos el método
enlacesPaginasModel($enlacesModel). La variable$enlacesModelrecibirá el valor que le enviemos (ej. "nosotros").Dentro del método, usamos una condición para validar que el valor recibido sea uno de los permitidos.
Si es válido, construimos la ruta completa al archivo dentro de la carpeta
modules.Finalmente, usamos
return $modulopara devolver esa ruta al lugar desde donde fue llamado (el controlador). Esto es mucho mejor que usarecho, porque ahora podemos asignar el resultado a una variable.
Paso 4: El Controlador se Conecta con el Modelo (controller.php)
Ahora vamos a modificar el controlador para que, en lugar de hacer un echo, le pase el valor al modelo, reciba el resultado (la ruta del módulo), y se lo pase a la plantilla para que la incluya.
Actualiza controllers/controller.php:
<?php // controllers/controller.php class MvcController { public function plantilla() { include "views/template.php"; } public function enlacesPaginasController() { if (isset($_GET["action"])) { $enlacesController = $_GET["action"]; } else { $enlacesController = "inicio"; } // --- NUEVO: Conexión con el Modelo --- // Llamamos a la clase del modelo y a su método. // Usamos '::' (Scope Resolution Operator) para acceder al método de la clase. // Pasamos la variable $enlacesController como parámetro al método del modelo. $respuesta = EnlacesPaginas::enlacesPaginasModel($enlacesController); // --- Incluir el módulo en la vista --- // 'include' se usa para mostrar el contenido del archivo. include $respuesta; } } ?>
Paso 5: Refinando la Plantilla (template.php)
Notarás que en template.php estamos llamando al método enlacesPaginasController() y que él mismo ya está incluyendo (include) el archivo del módulo. Nuestra plantilla puede ser más simple, solo debe proveer el lugar donde el controlador "pintará" el contenido.
<!DOCTYPE html> <html> <head> <title>Mi Sitio MVC</title> </head> <body> <header><h1>LOGOTIPO</h1></header> <?php include "modules/navegacion.php"; ?> <section> <?php // Instanciamos el controlador y llamamos al método que se encarga // de conectar con el modelo e incluir el módulo correcto. $mvc = new MvcController(); $mvc->enlacesPaginasController(); ?> </section> </body> </html>
Probando el Ciclo Completo
Abre tu navegador y ve a
index.php. Verás la página con el contenido "PÁGINA DE INICIO".Haz clic en "Nosotros". La URL cambiará a
index.php?action=nosotrosy el contenido de la sección cambiará a "PÁGINA DE NOSOTROS".Prueba "Servicios" y "Contáctenos".
¡Ahora sí! El flujo está completo:
El usuario hace clic →
navegacion.php.La petición (
action=nosotros) llega aindex.php.index.phpllama al controladorMvcController.El controlador llama al modelo
EnlacesPaginas::enlacesPaginasModel('nosotros').El modelo evalúa, construye la ruta
views/modules/nosotros.phpy la devuelve.El controlador recibe la ruta y la incluye dentro de
template.php.El usuario ve la página de "Nosotros".
Resumen y Conceptos Clave
El Modelo es el cerebro: Ahora toda la lógica de "qué archivo mostrar según la acción" está en el modelo. El controlador solo orquesta el proceso.
Comunicación con Parámetros y Retorno: El controlador le pasa datos al modelo (
$enlacesController) y el modelo le retorna un resultado ($modulo). Esto es fundamental.includevsreturn: El modelo usareturnpara devolver información. El controlador usaincludepara mostrar esa información en la vista.Separación de Responsabilidades: Cada capa hace lo que le toca.
Vista: Muestra información.
Controlador: Recibe peticiones y las dirige.
Modelo: Procesa la lógica de negocio.
En la siguiente parte, podríamos modificar el modelo para que, en lugar de devolver la ruta de un archivo estático, consulte una base de datos y le devuelva los resultados al controlador, quien se los pasaría a una vista para ser mostrados. ¡Las posibilidades son infinitas!
Comentarios
Publicar un comentario