Model-View-Controller (MVC) es probablemente uno de los patrones más cotizados en el mundo de la programación web en los últimos años. Cualquiera que trabaje actualmente en algo relacionado con el desarrollo de aplicaciones web habrá escuchado o leído el acrónimo cientos de veces. Hoy, aclararemos qué significa MVC y por qué se ha vuelto tan popular..
MVC no es un patrón de diseño, es un patrón arquitectónico que describe una forma de estructurar nuestra aplicación y las responsabilidades e interacciones de cada parte en esa estructura..
Se describió por primera vez en 1979 y, obviamente, el contexto era un poco diferente. El concepto de aplicación web no existía. Tim Berners Lee sembró las semillas de la World Wide Web a principios de los años noventa y cambió el mundo para siempre. El patrón que utilizamos hoy para el desarrollo web es una adaptación del patrón original..
La popularización de esta estructura para aplicaciones web se debe a su inclusión en dos marcos de desarrollo que se han vuelto inmensamente populares: Struts y Ruby on Rails. Estos dos entornos marcaron el camino para los cientos de marcos creados posteriormente..
La idea detrás del patrón arquitectónico Modelo-Vista-Controlador es simple: debemos tener las siguientes responsabilidades claramente separadas en nuestra aplicación:
La aplicación se divide en estos tres componentes principales, cada uno a cargo de diferentes tareas. Veamos una explicación detallada y un ejemplo..
los Controlador gestiona las solicitudes de los usuarios (recibidas como solicitudes HTTP GET o POST cuando el usuario hace clic en los elementos de la GUI para realizar acciones). Su función principal es llamar y coordinar los recursos / objetos necesarios para realizar la acción del usuario. Por lo general, el controlador llamará al modelo apropiado para la tarea y luego seleccionará la vista apropiada.
los Modelo son los datos y las reglas que se aplican a esos datos, que representan conceptos que la aplicación administra. En cualquier sistema de software, todo se modela como datos que manejamos de cierta manera. ¿Qué es un usuario, un mensaje o un libro para una aplicación? Solo los datos que deben manejarse de acuerdo con reglas específicas (la fecha no puede estar en el futuro, el correo electrónico debe tener un formato específico, el nombre no puede tener más de x caracteres, etc.).
El modelo le da al controlador una representación de los datos de lo que solicite el usuario (un mensaje, una lista de libros, un álbum de fotos, etc.). Este modelo de datos será el mismo, sin importar cómo queramos presentárselo al usuario, es por eso que podemos elegir cualquier vista disponible para representarla..
El modelo contiene la parte más importante de nuestra lógica de aplicación, la lógica que se aplica al problema con el que estamos tratando (un foro, una tienda, un banco, etc.). El controlador contiene una lógica organizativa más interna para la aplicación en sí misma (más como la limpieza).
los Ver Proporciona diferentes formas de presentar los datos recibidos del modelo. Pueden ser plantillas donde se llenan esos datos. Puede haber varias vistas diferentes y el controlador tiene que decidir cuál usar.
Una aplicación web suele estar compuesta por un conjunto de controladores, modelos y vistas. El controlador puede estar estructurado como un controlador principal que recibe todas las solicitudes y llama a controladores específicos que manejan acciones para cada caso.
Supongamos que estamos desarrollando una tienda de libros en línea. El usuario puede realizar acciones como: ver libros, registrarse, comprar, agregar artículos al pedido actual, crear o eliminar libros (si es un administrador, etc.). Vamos a ver qué pasa cuando el usuario hace clic en el fantasía Categoría para ver los títulos que tenemos disponibles..
Tendremos un controlador particular para manejar todas las acciones relacionadas con los libros (ver, editar, crear, etc.). Llamémoslo books_controller.php para este ejemplo. También tendremos un modelo, por ejemplo book_model.php, manejo de datos y lógica relacionada con los artículos en la tienda. Finalmente tendremos una serie de vistas para presentar, por ejemplo, una lista de libros, una página para editar libros, etc..
La siguiente figura muestra cómo se maneja la solicitud del usuario para ver la lista de libros de fantasía:
El controlador (books_controller.php) recibe la solicitud del usuario [1] como una solicitud HTTP GET o POST (también podemos tener un controlador central, por ejemplo index.php que lo recibe y luego llama a books_controller.php).
El controlador examina la solicitud y los parámetros y llama al modelo (book_model.php) preguntando Le devolverá la lista de libros de fantasía disponibles [2].
El modelo es responsable de obtener esa información de la base de datos (o donde sea que esté almacenada) [3], aplicar filtros o lógica si es necesario, y devolver los datos que representan la lista de libros [4].
El controlador utilizará la vista apropiada [5] para presentar estos datos al usuario [6-7]. Si la solicitud proviene de un teléfono móvil, se utilizará una vista para teléfonos móviles, si el usuario tiene un aspecto particular seleccionado, se elegirá la vista correspondiente, y así sucesivamente..
La ventaja más obvia que obtenemos al utilizar MVC es una clara separación de presentación (la interfaz con el usuario) y la lógica de la aplicación..
El soporte para diferentes tipos de usuarios que usan diferentes tipos de dispositivos es un problema común en estos días. La interfaz presentada debe ser diferente si la solicitud proviene de una computadora de escritorio o de un teléfono celular. El modelo devuelve exactamente los mismos datos, la única diferencia es que el controlador elegirá una vista diferente para renderizarlos (podemos pensar en una plantilla diferente).
Además de aislar la vista de la lógica empresarial, la separación M-V-C reduce la complejidad al diseñar aplicaciones grandes. El código es mucho más estructurado y, por lo tanto, más fácil de mantener, probar y reutilizar..
Cuando usa un marco, la estructura básica para MVC ya está preparada y solo tiene que ampliar esa estructura, colocando sus archivos en el directorio apropiado, para cumplir con el patrón de Modelo-Vista-Controlador. También obtienes mucha funcionalidad ya escrita y probada a fondo..
Tome cakePHP como un ejemplo de marco MVC. Una vez que lo tengas instalado, verás tres directorios principales:
los aplicación carpeta es donde colocas tus archivos. Es tu lugar para desarrollar tu parte de la aplicación..
los pastel la carpeta es donde CakePHP tiene sus archivos y donde han desarrollado su parte (funcionalidad del marco principal).
los vendedores La carpeta es para bibliotecas PHP de terceros si es necesario..
Su lugar de trabajo (directorio de aplicaciones) tiene la siguiente estructura:
Ahora tienes que poner tus controladores en el controladores directorio, tus modelos en el modelos directorio y sus opiniones en ... el puntos de vista directorio!
Una vez que se haya acostumbrado a su marco, podrá saber dónde buscar casi cualquier pieza de código que necesite modificar o crear. Esta organización por sí sola hace mucho más fácil el mantenimiento..
Dado que este tutorial no pretende mostrarle cómo crear una aplicación usando cakePHP, lo usaremos solo para mostrar el código de ejemplo para los componentes del modelo, la vista y el controlador, y comentaremos los beneficios de usar un marco MVC. El código está simplificado en exceso y no es adecuado para aplicaciones reales.
Recuerde que teníamos una librería y un usuario curioso que desea ver la lista completa de libros en el fantasía categoría. Dijimos que el controlador será el que reciba la solicitud y coordine las acciones necesarias..
Entonces, cuando el usuario haga clic, el navegador solicitará esta url:
www.ourstore.com/books/list/fantasy
A CakePHP le gusta formatear las URL en el formulario / controller / action / param1 / param2, donde acción Es la función para llamar dentro del controlador. En el antiguo formato de url clásico sería:
www.ourstore.com/books_controller.php?action=list&category=fantasy
Con la ayuda del marco de CakePHP, nuestro controlador se verá algo así:
set ('books', $ this-> Book-> findAllByCategory ($ category)); función add () ... function delete () ……?>
Simple, ¿no? Este controlador se guardará como books_controller.php y se colocará en / app / controllers. Contiene la función de lista, para realizar la acción en nuestro ejemplo, pero también otras funciones para realizar otras acciones relacionadas con el libro (agregar un libro nuevo, eliminar un libro nuevo, etc.).
El marco nos proporciona muchas cosas y solo se necesita una línea para enumerar los libros. Tenemos clases base con el comportamiento básico del controlador ya definido, por lo que heredamos de ellas (AppController, que hereda de Controller).
Todo lo que tiene que hacer en la acción de lista es llamar al modelo para obtener los datos y luego elegir una vista para presentársela al usuario. Vamos a explicar cómo se hace esto..
este-> libro Es nuestro modelo, y esta parte:
$ this-> Book-> findAllByCategory ($ category)
le está diciendo al modelo que devuelva la lista de libros en la categoría seleccionada (veremos el modelo más adelante).
los conjunto Método en la línea:
$ this-> set ('books', $ this-> Book-> findAllByCategory ($ category));
Es la forma del controlador de pasar datos a la vista. Establece el libros variable a los datos devueltos por el modelo y lo hace accesible a la vista.
Ahora solo tenemos que renderizar la vista, pero CakePHP lo hará automáticamente si queremos la vista predeterminada. Si necesitamos cualquier otra vista solo tenemos que llamarlo explícitamente usando el hacer método.
El modelo es aún más simple:
¿Por qué vacío? Debido a que se hereda de una clase base que proporciona la funcionalidad necesaria y hemos seguido las convenciones de nombres de CakePHP para permitir que el marco realice otras tareas automáticamente. Por ejemplo, CakePHP sabe, basado en nombres, que este modelo se usa en BooksController y que accederá a una tabla de base de datos llamada libros..
Solo con esta declaración tenemos un modelo de libro capaz de leer, borrar o guardar datos de la base de datos.
El código se guardará como book.php y se colocará en / app / models.
Todo lo que tenemos que hacer ahora es crear una vista (al menos una) para la acción de lista. La vista tendrá el código HTML y algunas líneas PHP (lo menos posible) para recorrer la matriz de libros proporcionada por el modelo..
Título | Autor | Precio |
---|---|---|
Como podemos ver, la vista no produce una página completa, solo un fragmento HTML (una tabla en este caso). Esto se debe a que CakePHP proporciona otra forma de definir el diseño de la página, y las vistas se insertan en ese diseño. El marco también nos proporciona algunos objetos de ayuda para facilitar las tareas comunes al crear estos extractos HTML (insertar formularios, enlaces, Ajax o JavaScript).
Hacemos que esta sea la vista predeterminada guardándola como list.ctp (lista es el nombre de la acción y ctp significa plantilla de pastel) y la colocamos en / app / views / books (dentro de los libros porque son vistas para las acciones del controlador de libros).
Y esto completa los tres componentes con la ayuda del framework CakePHP.!
Hemos aprendido cuál es probablemente el patrón arquitectónico más utilizado hoy en día. Sin embargo, debemos ser conscientes de que cuando hablamos de patrones en el mundo de la programación, estamos hablando de marcos flexibles, para adaptarlos al problema particular en cuestión. Encontraremos implementaciones que introducen variaciones en la estructura que hemos visto, pero lo importante es que, al final, el patrón nos ayuda a obtener una clara división entre responsabilidades y una mejor capacidad de mantenimiento, reutilización de códigos y pruebas..
También hemos visto las ventajas de utilizar un marco MVC que nos proporciona un esqueleto MVC básico y mucha funcionalidad, mejorando nuestra productividad y facilitando el proceso de desarrollo. Gracias por leer!