Unidad 4: Patrón MVC
4.4 Controlador Frontal (Front Controller)
4.4.1 ¿Qué es el patrón MVC?
El patrón Modelo-Vista-Controlador (MVC) es una arquitectura de software ampliamente utilizada en el desarrollo de aplicaciones web. Separa las responsabilidades de una aplicación en tres componentes distintos:
- Modelo: Representa los datos y la lógica de negocio de la aplicación. Es responsable de interactuar con la base de datos y devolver los datos procesados.
- Vista: Se encarga de la presentación, mostrando los datos al usuario de manera estructurada y visual. La Vista recibe los datos del Controlador y los muestra.
- Controlador: Actúa como intermediario entre el Modelo y la Vista, gestionando las interacciones del usuario. El Controlador recibe las solicitudes del usuario, interactúa con el Modelo para obtener o modificar los datos, y luego actualiza la Vista con los resultados.
4.4.2 ¿Qué es un Controlador Frontal?
El Controlador Frontal es un único punto de entrada para todas las solicitudes de la aplicación. En lugar de permitir que cada archivo PHP maneje directamente una solicitud, el Controlador Frontal se encarga de canalizar todas las solicitudes hacia los controladores específicos correspondientes.
Este patrón es muy útil porque centraliza el manejo de rutas y solicitudes, mejorando tanto la seguridad como la escalabilidad de la aplicación. Todos los accesos a la aplicación deben pasar a través de este controlador, lo que garantiza que la lógica de la aplicación se maneje de manera consistente y ordenada.
4.4.3 Ventajas de implementar un Controlador Frontal
- Seguridad: Se evita que los usuarios accedan directamente a archivos sensibles (como controladores o vistas) sin pasar por la validación del controlador frontal. Esto aumenta la seguridad de la aplicación.
- Escalabilidad: Al tener un único punto de entrada, es más fácil escalar la aplicación añadiendo nuevas rutas o controladores sin afectar el flujo general.
- Mantenimiento: Facilita el mantenimiento de la aplicación, ya que todo el flujo de control está centralizado, lo que hace que la administración de las rutas sea más sencilla.
Diagrama de flujo básico con Controlador Frontal
A continuación, un gráfico que ilustra cómo interactúan el Controlador Frontal, el Modelo, la Vista y el Controlador de Empleados (en este caso, veremos cómo se maneja la acción de ver empleados).
graph TD
A[Usuario] --> B["Controlador Frontal (index.php)"]
B --> C[Controlador de Empleados]
C --> D[Modelo de Empleados]
D --> E[Base de Datos]
C --> F[Vista de Empleados]
F --> A
C -->|VerEmpleados| C1
C1 --> C2
subgraph VerEmpleados
C1[Obtener lista de empleados]
C2[Mostrar empleados en tabla]
end
Explicación del Diagrama (Ver Empleados):
- El Usuario realiza una acción, por ejemplo, hacer clic en "Ver empleados".
- Controlador Frontal (index.php) recibe la solicitud. Este es el punto de entrada para todas las solicitudes.
- El Controlador Frontal pasa la solicitud al Controlador de Empleados (si la solicitud está relacionada con los empleados).
- El Controlador de Empleados interactúa con el Modelo de Empleados, que se comunica con la Base de Datos para obtener la información.
- Los datos obtenidos son enviados a la Vista de Empleados, que los muestra al Usuario.
Ahora podemos ver un flujo básico de cómo se manejan las solicitudes en una aplicación que sigue el patrón MVC con un Controlador Frontal. Por ejemplo el caso de uso de: Modificar empleado.
graph TD
A[Usuario] --> B["Controlador Frontal (index.php)"]
B --> C[Controlador de Empleados]
C --> D[Modelo de Empleados]
D --> E[Base de Datos]
C --> F[Vista de Empleados]
F --> A
C -->|"modificarEmpleado"| C1
C1 --> C2
C2 --> C3
subgraph "ModificarEmpleado"
C1[Obtener datos del empleado]
C2[Mostrar formulario de edición]
C3[Actualizar empleado en la base de datos]
end
Explicación del Diagrama (Modificar Empleado):
- El Usuario realiza una acción, por ejemplo, hacer clic en "Modificar empleado".
- Controlador Frontal (index.php) recibe la solicitud. Este es el punto de entrada para todas las solicitudes.
- El Controlador Frontal pasa la solicitud al Controlador de Empleados (si la solicitud está relacionada con los empleados).
- El Controlador de Empleados interactúa con el Modelo de Empleados, que se comunica con la Base de Datos para obtener la información del empleado a modificar.
- Los datos obtenidos son enviados a la Vista de Empleados, que muestra un formulario para editar los datos del empleado.
- Una vez que el usuario completa el formulario y lo envía, la solicitud vuelve al Controlador Frontal.
- El Controlador Frontal pasa la solicitud al Controlador de Empleados, que actualiza los datos del empleado en la Base de Datos.
- Finalmente, el Controlador de Empleados redirige al usuario a la Vista de Empleados, que muestra la lista actualizada de empleados.
- El flujo se completa y el usuario ve la lista de empleados actualizada.
4.4.4 Modificación de la Estructura de la Aplicación
Objetivo:
Modificar la estructura de la aplicación de acuerdo con el patrón MVC y el Controlador Frontal. Vamos a asegurarnos de que todos los requests de la web pasen por el Controlador Frontal y que no sea posible acceder directamente a los scripts de Modelo, Vista, Controladores o formularios sin pasar por el controlador.
Pasos para Modificar la Estructura de la Aplicación
- Crear una estructura de rutas para la aplicación: Configuraremos el Controlador Frontal para redirigir correctamente las solicitudes a sus respectivos controladores y vistas.
- Redirigir solicitudes no autorizadas: Asegurarnos de que cualquier intento de acceder a archivos directamente (como el modelo o los controladores) sea redirigido a index.php.
- Configurar el controlador principal: Establecer que
index.phpsea el único punto de entrada, y a partir de ahí dirigir todas las solicitudes.
1. Redirigir todas las solicitudes a index.php
Ahora, vamos a asegurarnos de que no se pueda acceder directamente a los modelos, controladores o vistas sin pasar por index.php, que es el controlador frontal. Este archivo se encargará de gestionar todas las rutas de la aplicación.
Código para redirigir todas las solicitudes a index.php:
En primer lugar, debemos asegurarnos de que los usuarios no puedan acceder directamente a archivos PHP como el modelo, controlador, vistas, etc. Solo se podrá acceder a través de las rutas definidas en index.php.
Para ello, podemos incluir un archivo común que verifique si se está accediendo directamente a un archivo PHP y redirigir al index.php.
Crear un archivo común para validaciones de acceso: verificarAcceso.php
Este archivo será incluido en los archivos PHP que no deberían ser accesibles directamente. Este archivo lo podemos crear en la carpeta lib, donde iremos metiendo aquellos archivos comunes que necesitemos incluir en varios sitios.
Código de verificarAcceso.php:
Verificar acceso a archivos PHP
Este archivo se encargará de verificar si la solicitud proviene directamente de un archivo PHP (es decir, no a través del controlador frontal) y redirigir a index.php.
Incluir verificarAcceso.php en el inicio de cada archivo sensible:
Por ejemplo, en el archivo empleados.php, que es una vista que debería ser accesible solo a través del Controlador Frontal, añadimos esta validación:
Incluir verificarAcceso.php en archivos sensibles
Asegúrate de incluir el archivo verificarAcceso.php al inicio de todos los archivos sensibles de la aplicación (modelos, controladores, vistas, etc.) para evitar accesos no autorizados.
Nota: Asegúrate de incluir el archivo verificarAcceso.php al inicio de todos los archivos sensibles de la aplicación (modelos, controladores, vistas, etc.) para evitar accesos no autorizados. Esto garantiza que cualquier intento de acceder directamente a estos archivos sea redirigido al Controlador Frontal. Ten en cuenta utilizar la ruta relativa correcta al incluir el archivo, dependiendo de la ubicación de los archivos en tu estructura de directorios.
__ DIR __
Nota
__DIR__es una constante mágica de PHP que devuelve el directorio del archivo actual. Esto es útil para construir rutas relativas de manera segura, sin importar desde dónde se ejecute el script.
Este proceso debe repetirse para todos los archivos sensibles de la aplicación (vistas, controladores, etc.).
2. Redirigir solicitudes a index.php
El archivo index.php será el punto de entrada de nuestra aplicación. Aquí vamos a gestionar todas las solicitudes y dirigirlas a los controladores correspondientes.
Código de index.php:
Código de index.php
Este archivo será el punto de entrada de la aplicación y redirigirá todas las solicitudes al Controlador Principal.
Explicación:
index.phpahora es el punto único de entrada para todas las solicitudes.ControladorPrincipalse encarga de canalizar las solicitudes, redirigiendo a los controladores correspondientes (en este caso, empleados, departamentos, etc.).- Si el parámetro
accionno se pasa en la URL, se redirige a la acción por defecto (por ejemplo, inicio).
3. Controlador Principal (Front Controller)
El Controlador Principal es el responsable de gestionar las solicitudes y redirigirlas a los controladores adecuados. Este controlador puede incluir la lógica de negocio común, como la autenticación y la autorización, y luego delegar las solicitudes específicas a otros controladores.
Código de ControladorPrincipal.php:
Código de ControladorPrincipal.php
Este archivo contiene la lógica del Controlador Principal que redirige las solicitudes a los controladores específicos.
Explicación:
ControladorPrincipalrecibe la acción de la URL y decide qué controlador debe ejecutar.- Si la acción no es válida, redirige al index.php para evitar accesos no autorizados.
Resumen de lo realizado en este punto:
- Redirigir solicitudes no válidas: Hemos creado un archivo
verificarAcceso.phpque asegura que todos los accesos sean dirigidos al Controlador Frontal (index.php). De esta forma, cualquier intento de acceder directamente a archivos como modelos, controladores o vistas es redirigido automáticamente a la página de inicio. - Controlador Frontal (
index.php): Este archivo es el punto de entrada de la aplicación y redirige todas las solicitudes al ControladorPrincipal, que maneja la lógica de las rutas. - Controlador Principal: El Controlador Principal gestiona todas las solicitudes (acciones del usuario) y las redirige a los controladores específicos según la acción solicitada (ver, agregar, editar, eliminar empleados).
4.4.5 Modificación de los controladores vistas y formularios
Ahora ya no queremos que los usuarios accedan directamente a las vistas, así que tendremos que modificar el controlador de empleados para que se encargue de mostrar la vista correspondiente dependiendo de la accion utilizada por el susuario.
Por ejemplo para ver empleados esta era la función del controlador:
En este caso la función devuelve la lista de empleados (según la página selaccionada). Ahora nosotros queremos que esta función se encargue también de mostrar la vista correspondiente, de esta manera el controlador frontal solo tendrá que llamar a esta función cuando el usuario quiera ver la lista de empleados.En este caso la función carga los empleados en una variable $empleados y luego carga el script de la vista. Pero si ahora revisamos el script de la vista veremos que en la vista era cuando cargabamos el controlador de empleados (mal), eso ahora ya no queremos que funcione así. Ahora cuando se carga la vista ya hemos cagado previamente el controlador. La vista debe quedar así:
Vista de empledados
<?php
// Comprobar si el usuario proviene de la página de inicio
include __DIR__ . '/../lib/access.php';
?>
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<title>Empleados</title>
</head>
<body>
<h1>Lista de Empleados</h1>
<table>
<thead>
<tr>
<th>ID</th>
<th>Nombre</th>
<th>Apellido</th>
<th>Fecha de Nacimiento</th>
<th>Fecha de Contratación</th>
<th>Género</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<?php foreach ($empleados as $empleado): ?>
<tr>
<td><?= $empleado['emp_no'] ?></td>
<td><?= $empleado['first_name'] ?></td>
<td><?= $empleado['last_name'] ?></td>
<td><?= $empleado['birth_date'] ?></td>
<td><?= $empleado['hire_date'] ?></td>
<td><?= $empleado['gender'] ?></td>
<td>
<a href="index.php?accion=editar_empleado&id=<?= $empleado['emp_no'] ?>">Editar</a>
<button onclick="eliminarEmpleado(<?= $empleado['emp_no']?>);" >Eliminar</button>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<a href="index.php?accion=agregar_empleado">Agregar Nuevo Empleado</a>
<script>
function eliminarEmpleado(emp_no) {
if (confirm('¿Estás seguro de que deseas eliminar este empleado?')) {
window.location.href = `index.php?accion=eliminar_empleado&id=${emp_no}`;
}
}
</script>
</body>
</html>
En este escrip hay qye ver que ha diferentes modificaciones:
Los botones de accciones se han modificado para que pasen por el controlador frontal.
-
editar:
-
eliminar
-
crear
Pero claro, estos cambios también obligan a reescribir los formularios ya que estos también serán cargados pasando por el controlador frontal y llamandolos directamente desde las vistas.
Así quedará el formulario de empleados:
Formulario de empleados
Y ya para terminar, y teniendo en cuenta el uso de la superglobal __DIR__ también hemos hecho una modificación en el modelo de empleados, quedando el encabezamiento como sigue:
modificaciones modelo de empleados
4.4.6 Plan para la Página de Landing
En este punto, vamos a enfocarnos en crear una página de landing (página de inicio) con un menú básico. Desde esta página, los usuarios podrán acceder a la sección de Empleados y otras áreas (aunque, por ahora, solo funcionarán Inicio y Empleados). Además, se implementará un sistema de redirección para asegurar que todas las solicitudes (acciones CRUD) pasen por el Controlador Principal (Front Controller), garantizando que toda la lógica de la aplicación pase por un único punto de control.
Objetivos de este punto:
- Crear una página de landing con un menú de navegación accesible para todos los usuarios.
- Asegurarnos de que todas las solicitudes (CRUD) de la aplicación pasen siempre por el Controlador Principal.
Creación de la Página de Landing
Objetivo:
Crear una página de bienvenida o landing que sirva como punto de entrada para el usuario. Esta página incluirá un menú de navegación con enlaces a las secciones de la aplicación, como Empleados, Departamentos, Contacto, etc. De momento, las secciones de Empleados y Inicio serán las únicas activas.
Estructura de la Página de Landing:
La página debe contener lo siguiente:
- Cabecera con el menú de navegación.
- Contenido central con un mensaje de bienvenida.
- Pie de página con información adicional como derechos de autor.
Código de la Página de Landing (index.php)
Explicación:
- Menú de navegación: El menú tiene enlaces a las secciones Inicio, Empleados, Departamentos y Contacto. Si el usuario no está autenticado, se muestra un enlace para iniciar sesión.
- Contenido central: Contiene un mensaje de bienvenida y una descripción de las funcionalidades de la aplicación.
- Pie de página: Información adicional (por ejemplo, derechos de autor).
Canalizar las Solicitudes a través del Controlador Principal
Ahora que tenemos la página de landing creada, debemos asegurarnos de que todas las solicitudes (acciones CRUD) pasen por el Controlador Principal. Esto significa que en lugar de acceder directamente a archivos como crear_editar_empleado.php o eliminar.php, redirigiremos todas las solicitudes a index.php. Este punto ya debe haber sido implmentado en el controlador frontal, pero lo repetimos para asegurarnos de que no se nos olvide.
también es el momento de asegurarnos que no hat llamadas a los controladores desde las vistas, ya que ahora el controlador frontal se encargará de cargar las vistas y los controladores. Por lo tanto, en la vista de empleados no cargaremos el controlador de empleados, sino que lo haremos desde el controlador frontal.
Modificación de ControladorPrincipal.php para Manejar las Solicitudes
El Controlador Principal se encargará de canalizar las solicitudes hacia el Controlador de Empleados o cualquier otro controlador que se necesite.
Lo mismo que hicimos en el punto anterior, esto ya debe estar implementado pero nos aseguramos de que el controlador frontal se encargue de redirigir las solicitudes a los controladores correspondientes.
Explicación:
- El Controlador Principal maneja las solicitudes y redirige al Controlador de Empleados para realizar las acciones correspondientes.
- Si la acción no es válida, redirige al index.php.
Resumen:
- Página de Landing (
index.php): Hemos creado una página de bienvenida con un menú de navegación. La página también incluye enlaces para iniciar sesión y navegar a otras secciones. - Redirección de solicitudes: En lugar de acceder directamente a archivos como
crear_editar_empleado.phpoeliminar.php, redirigimos todas las solicitudes aindex.phppara que pasen por el Controlador Frontal. - Controlador Frontal (
index.php): Este archivo ahora es el único punto de entrada para todas las solicitudes. Canaliza las acciones a los controladores adecuados.
4.4.7. Pasos para la implementación de la autenticación:
- Crear un archivo JSON con usuarios y contraseñas.
- Crear una clase de autenticación en PHP que valide los usuarios.
- Crear la página de inicio de sesión (
login.php) que permita a los usuarios ingresar sus credenciales. - Redirigir a la página de empleados si el usuario se autentica correctamente, y redirigir a
login.phpsi no se autentica.
1. Crear el archivo JSON con usuarios y contraseñas
Empezamos creando un archivo usuarios.json que contendrá las credenciales de los usuarios. Este archivo contendrá los nombres de usuario y las contraseñas cifradas (por ahora usaremos contraseñas en texto claro para simplificar).
Contenido de usuarios.json
Este archivo contendrá un array de objetos, donde cada objeto representa un usuario con su nombre de usuario y contraseña.
- Formato JSON: Almacenamos un array con objetos, donde cada objeto tiene un nombre de usuario (
username) y una contraseña (password).
2. Crear la clase de autenticación (Autenticacion.php)
La clase Autenticacion se encargará de validar las credenciales de los usuarios. Recibirá el nombre de usuario y la contraseña, y verificará si coinciden con los datos en el archivo usuarios.json.
Código de Autenticacion.php
Este archivo contiene la clase Autenticacion que valida las credenciales de los usuarios.
Explicación:
validarUsuario(): Esta función recibe un nombre de usuario y una contraseña, y busca en el archivousuarios.jsonsi las credenciales coinciden.json_decode(): Decodifica el contenido del archivo JSON para convertirlo en un array PHP.- Si las credenciales son correctas, devuelve
true, de lo contrario devuelvefalse.
3. Crear la página de inicio de sesión (login.php)
La página de inicio de sesión permitirá a los usuarios ingresar sus credenciales (nombre de usuario y contraseña). Al validar las credenciales, redirigirá al usuario a la página de empleados si es exitoso, o mostrará un mensaje de error si la validación falla.
Código de login.php
Este archivo contiene el formulario de inicio de sesión y la lógica para validar las credenciales.
Explicación:
- Formulario de inicio de sesión: El formulario solicita nombre de usuario y contraseña.
- Validación: Cuando el formulario se envía, la clase
Autenticacionse encarga de validar las credenciales. - Si las credenciales son correctas, el nombre de usuario se guarda en
$_SESSION['usuario'], y el usuario es redirigido a la página empleados.php. - Si las credenciales son incorrectas, muestra un mensaje de error.
4. Crear el script de logout
Vamos a crear el script de logout que se encargará de cerrar la sesión del usuario. Este script eliminará la variable de sesión que contiene el nombre de usuario y redirigirá al usuario a la página de inicio de sesión.
Código de logout.php
Este archivo cierra la sesión del usuario y lo redirige a la página de inicio de sesión.
Controlador frontal: Impedir acceso a la páginas sin autenticación.
Para impedir que algún usuario acceda a la página de empleados sin haber iniciado sesión, vamos a incluir un script de verificación al inicio de la página de empleados. Este script verificará si el usuario está autenticado y, si no lo está, lo redirigirá a la página de inicio de sesión. Hay que tener en cuenta que cualquier usuario puede escribir en la barra de direcciones la URL de la página de empleados, por lo que es importante proteger el acceso a esta página. No es suficiente con eliminar el acceso en el menú de navegación.
Para esta vamos a modificar el controlador frontal. Vamos a crear una lista de acciones que no requieren autenticación. Por tanto cuando el usuario acceda sin autenticación se verificará que la acción no esté en la lista de acciones que no requieren autenticación. Si la acción no está en la lista, se redirigirá al usuario a la página de inicio de sesión.
Código de ControladorPrincipal.php modificado
Explicación:
-
Autenticación: Verificamos si el usuario está autenticado a través de la sesión. Si no lo está, se le redirige a
login.php. -
logout: Una vez logado el usuario puede cerrar sesión haciendo clic en el enlace de Cerrar sesión. Esto destruirá la sesión y redirigirá al usuario a la página de inicio de sesión. Una vez cerrada la sesión, el usuario ya no podrá acceder a la página de empleados ni a ninguna otra página protegida.
-
Protección del controlador frontal: El controlador frontal se encarga de verificar si el usuario está autenticado antes de permitir el acceso a las páginas protegidas. Si el usuario no está autenticado, se le redirige a la página de inicio de sesión.
Resumen de la implementación:
-
Autenticación con JSON:
- Creamos un archivo
usuarios.jsonque contiene las credenciales de los usuarios. - La clase
Autenticacionvalida el nombre de usuario y la contraseña comparándolos con el archivo JSON.
- Creamos un archivo
-
Página de inicio de sesión
- La página
login.phppermite a los usuarios ingresar sus credenciales. - Si la autenticación es exitosa, el usuario es redirigido a la página empleados.php.
- La página
-
Protección de la página de empleados:
- Solo los usuarios autenticados pueden acceder a la página empleados.php.
- Si el usuario no está autenticado, se le redirige a login.php.
- Nota: Podemos ver que solo se controla que el usuario esté logado en la página princial y en el controlador frontal. Con esto debería ser suficiente siempre y cuando cuidemos en la apliación que todas las peticiones pasen por el controlador frontal. De esta manera no es necesario controlar el acceso a cada una de las páginas de la aplicación. Si en algún momento se quiere controlar el acceso a alguna página en concreto, se puede hacer de la misma manera que hemos hecho con el controlador frontal. En este caso, se puede incluir el script de verificación al inicio de la página que queremos proteger.
4.4.8 Desactivar opciones de menú (login)
- Mostrar u ocultar las opciones del menú:
- Si el usuario no está autenticado, las opciones de Empleados y Departamentos serán invisibles o desactivadas.
- Si el usuario está loggeado, estas opciones se mostrarán y estarán activas.
- Usar sesiones de PHP para verificar si el usuario está autenticado.
- Usaremos la variable de sesión (
$_SESSION['usuario']) para determinar si el usuario está logeado o no.
- Usaremos la variable de sesión (
Modificación del código de index.php para ocultar/desactivar las opciones del menú
Aquí tienes cómo se puede modificar el menú de navegación para ocultar las opciones de Empleados y Departamentos si el usuario no está autenticado.
Código de index.php modificado
Explicación de los cambios:
-
Verificación de sesión:
- Usamos
isset($_SESSION['usuario'])para verificar si el usuario está autenticado. - Si está logeado, las opciones de Empleados y Departamentos serán visibles y activas.
- Si no está logeado, las opciones de Empleados y Departamentos no estarán visibles en el menú.
- Usamos
-
Menú dinámico:
- El menú se adapta dependiendo del estado de la sesión. Si el usuario está autenticado, tiene acceso a todas las opciones; si no, solo puede ver Inicio y Contacto, y el enlace de Login.
Estilo CSS para desactivar las opciones del menú (Opcional)
Si deseas que las opciones del menú estén visibles pero desactivadas (en lugar de invisibles), puedes aplicar CSS para deshabilitar los enlaces de Empleados y Departamentos cuando el usuario no esté logueado.
Código CSS para desactivar enlaces
/* Ocultar los enlaces si no hay sesión activa */
.navbar li a.disabled {
pointer-events: none; /* Desactivar el clic */
color: gray; /* Cambiar el color para indicar que está desactivado */
}
/* Estilo de los enlaces desactivados */
.navbar li a.disabled:hover {
color: gray; /* Evitar que se cambie el color cuando se pasa el mouse */
}
Código de menú con enlaces desactivados
Explicación:
- Si el usuario no está logeado, los enlaces de Empleados y Departamentos estarán visibles pero desactivados.
- El estilo
pointer-events: nonepreviene que el usuario haga clic en estos enlaces desactivados.
Resumen de la implementación:
- Menú dinámico: La opción de Empleados y Departamentos solo está disponible si el usuario está autenticado.
- Estilo CSS (opcional): Puedes optar por ocultar las opciones de Empleados y Departamentos o desactivarlas (usando CSS).
- Redirección a login: Si el usuario no está autenticado, solo podrá ver las opciones de Inicio y Contacto, y podrá iniciar sesión.
Disgrama de la aplicación
---
config:
theme: redux
layout: fixed
---
flowchart TD
subgraph subControllers["subControllers"]
SC1["Employees"]
SC2["Departments"]
end
User(["User"]) --> A["Request"]
A --> B["Front Controller"]
B --> subControllers
subControllers <--> C["Models"] & D["Views"]
subControllers --> Response["Response"]
Response --> User
D <--> n2["HTML"]
C <--> n1["DB"]
A@{ shape: rounded}
Response@{ shape: rounded}
n2@{ shape: card}
n1@{ shape: cyl}