OMI ...
MVC es un patrón de diseño muy genérico que no necesariamente decir lo que es bueno y qué es malo. Hay un modelo, una vista y un controlador. Las responsabilidades de cada una de estas cosas dependen del sabor de MVC, y el sabor de MVC que elija debe depender de la complejidad de su proyecto. Por ejemplo, si tiene un proyecto impulsado por dominio, los ejemplos dados por otros aquí no funcionarían muy bien.
Así que en su misma base:
modelo: Un objeto que tiene los datos que se mostrará en la vista. No se define aquí si se trata de un DTO o un modelo de dominio, pero compartiré mis ideas sobre esto en un segundo.
Ver: Es lo que el usuario ve y cómo interactúa el usuario. Cualquier código o lógica aquí debería apoyar directamente la vista. En otras palabras, ZERO business logic, ZERO access access logic, ZERO knowledge of anything más allá de lo que el usuario ve físicamente. Ya sea un formulario web, un formulario de ventana de escritorio o actividad (móvil), etc. ...
Controlador: Probablemente la pieza más ambigua de este rompecabezas. Una cosa es segura, media entre la vista y el "modelo" y también decide qué sucede después o más bien, 'controla' el flujo. Pero es importante no tomar esa descripción demasiado lejos. Lo que hace esto realmente depende de tu comprensión de MVC. Así que compartiré la forma en que lo veo en un contexto web; pero, básicamente, solo trace una línea entre controlar el flujo del servicio y, de hecho, realizar el servicio.
MVC, para mí, no es una forma diferente de describir N-tier, como algunas personas pueden afirmar. No hay capas en MVC como MVC está realmente EN su capa de presentación. Cada elemento de MVC en realidad vive en la capa de presentación y el patrón MVC simplemente dice que debe separar las preocupaciones entre obtener los datos y mostrarlos:
- Modelo: cómo son los datos. En realidad sólo una estructura que la vista usará para obtener sus datos
- Vista: mostrarla realmente
- controlador: Averiguar dónde obtener los datos para el modelo, o incluso el propio modelo.
Si puede aceptar esa afirmación, entonces debería ayudar a aclarar qué es realmente el modelo en este contexto. El modelo NO es un objeto de acceso a datos y el modelo NO es un modelo de dominio porque ninguna de esas cosas debería estar en su capa de presentación. Entonces eso nos deja con un ViewModel (MVVM) o un DTO. Voy a ir con DTO por simplicidad.
Entonces, si hemos aceptado DTO como el tipo de modelo del que estamos hablando cuando decimos "modelo" en MVC, entonces, ¿dónde lo conseguimos? Si el controlador no debe interferir con el acceso a los datos, ¿dónde? ¿Qué hay de su capa de servicio? Su capa de servicio contiene todo el "cómo" de su aplicación. Es la capa "Hacer cosas". Entonces, si su vista quiere crear un usuario, recopilará los datos y se los entregará al controlador. El controlador decide qué servicio (s) llamar para realizar la tarea y le envía la solicitud con los datos necesarios. La capa de servicio responde con un DTO. Ese DTO puede usarse directamente o agregarse a otro modelo (si se llamaron varios servicios, por ejemplo).
Los puntos importantes son:
- El controlador no sabe nada acerca de su dominio (si lo tiene), sólo se sabe acerca de los servicios disponibles y cómo llamarlos.
- Absolutamente no negocio lógica es realizada por el controlador. Por ejemplo, si necesita enviar un correo electrónico de bienvenida como parte de la operación CreateUser, el controlador no lo iniciará ya que técnicamente es una regla comercial. Se manejaría entre su servicio y las capas de dominio.
- En mi opinión, el controlador tampoco debe tener acceso a los datos. Eso debería delegarse en una capa de servicio. Muchos tutoriales tienden a mostrar que el controlador interactúa con los repositorios, lo que supongo que está bien porque es una abstracción, pero el acceso directo a los datos debe ser absolutamente absoluto en la capa de presentación.
Nuevamente, esto en un contexto web. Si estás trabajando con MVC en una aplicación de Android, tal vez no tengas una capa de servicio o un dominio. Quizás interactúes con una clase diferente de objetos. Personalmente, siempre uso las capas de servicio o aplicación, y por varias razones que pueden ser consideradas valiosas o no para otros.
Así que en MVC.Net, el controlador es más como un API; la vista y la API son dos medios de presentación diferentes que deben funcionar juntos (el controlador de fondo presenta datos, el controlador de frontend construye modelos con esos datos y media con la vista). En Angular, el controlador se parece más a lo que estamos hablando aquí. Capas de capas de capas, parece. Es un poco confuso conceptualizar, pero el concepto en realidad nunca se mueve más allá de la capa de presentación.
Pero para resumir: El controlador "controla" las operaciones y los datos que entran y salen de su sistema, y desde el punto de vista pero realidad no hace el negocio. Los detalles de ese proceso dependen en gran medida de su filosofía de diseño para el proyecto.
Así que aquí en este diagrama, He agrupado los conceptos para mostrar MVC dentro de N-capas en una aplicación típica monolítica. La comunicación se ejecuta de izquierda a derecha y no salta sobre ninguna otra capa (ver: Arquitectura de cebolla). En la capa de presentación, el controlador conoce el modelo y la vista, pero la vista y el modelo no saben nada en su mayor parte. Sin embargo, en muchos aspectos de MVC, incluidos ASP.Net y MVVM, la vista puede conocer la interfaz del modelo o el prototipo (pero no la instancia del modelo) para que pueda vincularse.
El controlador manejaría la manipulación del modelo (o vería el modelo en este contexto) lo que significa que podría necesitar conocer el objeto de dominio y los servicios de dominio. Opcionalmente puede insertar una capa de aplicación entre la capa de presentación y el dominio si desea una aplicación más reutilizable (por ejemplo, su aplicación podría tener varias cabezas: una API web y una aplicación de escritorio y una aplicación móvil, etc.) para proporcionar una límite transaccional y mayor aislamiento. Es importante que la vista no tenga conocimiento/dependencia de los objetos de dominio en esta arquitectura, por eso hay un modelo separado para la vista. El objetivo del modelo en MVC es crear un modelo para la vista. Es decir, es un modelo diseñado específicamente para servir a la vista, NO el dominio. Está bien que el modelo de vista ajuste/adapte el modelo de dominio siempre que nunca se exponga públicamente y/o se serialice accidentalmente.
En una nota al margen, la "capa de presentación" en una API web, en mi opinión, es el contrato serializado (por ejemplo, JSON o XML). Entonces trata eso en consecuencia.
Hmm ... ¡muy difícil para mi cerebro no tan bueno entenderlo! :( Acepto que mi ejemplo es trivial y no hay una necesidad real de controlador en él. Pero supongo que si codificara lo mismo con CakePHP sería obligatorio para mí crear un controlador. ¿Puede ayudarme? para agregar un controller.php a mi código. Está bien incluso si no hace nada útil. Solo quiero entender cómo los controladores se comunican con modelos y vistas. – Cracker
No conozco CakePHP, así que no puedo ayudarte en esto Mi sugerencia es la siguiente: dividir el modelo (manejo de datos) de la vista (presentación). Cuando la vista crezca demasiado, aislar en otro objeto/archivo PHP todo lo que no tenga nada que ver con la representación visual. –
No. Estoy no estoy hablando de CakePHP. Estoy hablando de agregar controller.php a mi código PHP mencionado anteriormente. – Cracker