vista pattern mvc modelo example ejemplos controlador model-view-controller design-patterns application-design

model-view-controller - pattern - mvc frameworks



¿Qué, específicamente, pertenece a un Modelo, una Vista y un Controlador? (2)

He estado aprendiendo sobre el paradigma Modelo-Vista-Controlador ("MVC"), pero estoy bastante confundido ya que algunos tutoriales contradicen otros tutoriales.

Mi comprensión actual del proceso se ve así:

Router / Dispatcher / Front Controller:

  • Aunque no se menciona específicamente en el nombre "MVC", el enrutador sigue siendo una parte muy importante. Es aquí donde las solicitudes se traducen de URL sin procesar a un controlador específico. Por ejemplo, enrutar una solicitud de www.StackUnderflow.com/question/123 al controlador de "Pregunta" de la aplicación.

Modelo:

  • Aquí es donde se recopilan los datos brutos de alguna fuente de almacenamiento, como una base de datos o un archivo XML. El modelo sirve como una capa de abstracción, traduciendo la solicitud del Controlador de datos específicos en (por ejemplo) una consulta SQL y traduciendo los resultados de la consulta en un formato estándar como un objeto de datos.

  • Por ejemplo, en el escenario / browse / all indicado anteriormente:

    • El Controlador de "Pregunta" le preguntaría al Modelo "Por favor proporcione los datos para la pregunta 123".
    • El Modelo luego traduciría eso en "SELECCIONAR * FROM Preguntas WHERE Id = 123;" y puntúalo a la base de datos
    • La base de datos devolvería un registro de "Pregunta" al Modelo.
    • El Modelo tomaría el registro y lo traduciría a un objeto de datos de Pregunta
    • Luego, el Modelo pregunta lo mismo "SELECCIONAR * FROM Respuestas DONDE QuestionID = 123;" y crea una matriz de objetos de respuesta a partir del conjunto de resultados, y lo agrega a la variable de miembro de respuestas del objeto de pregunta.
    • El Modelo devolvería el objeto de la Pregunta al Controlador de "Pregunta" .

Controlador:

  • Este es el verdadero caballo de batalla de la aplicación. Además de transmitir mensajes de ida y vuelta al Modelo y a la Vista , el Controlador también es responsable de cosas como la Autorización. y aplicación / lógica de "negocios" Editar: por respuesta, la lógica comercial pertenece al modelo.

  • En el ejemplo actual, el controlador será responsable de:

    • Asegurando que el usuario esté conectado.
    • Determinar QuestionId desde la URL.
    • Determinar qué vista usar
    • Enviando códigos HTTP y redirigiendo si es necesario.
    • Pedirle al Modelo los datos y almacenar los datos necesarios en las variables miembro.

Ver:

  • En general, View es la parte más simple de la aplicación. En su mayoría consiste, en una aplicación básica, en plantillas HTML. Estas plantillas tendrían marcadores de posición para insertar datos en la plantilla de las variables de miembro del Controlador:

p.ej

<html> <head> <title> <?php $question->getTitle() ?> </title> </head> <body> <h1> <?php $question->getQuestionText(); ?> </h1> <h2> Answers: </h2> <div class="answerList"> <?php formatAnswerList($question->getAnswers()); ?> </div> </body> </html>

  • La vista también contendría métodos para formatear datos para la entrega al usuario. Por ejemplo, el método anterior de formatAnswerList() tomaría una matriz de respuestas, tomadas del Controlador , y las recorrería mientras llamaba algo como include $markupPath . "/formatAnswer.inc" include $markupPath . "/formatAnswer.inc" que sería una plantilla pequeña de solo un contenedor de respuestas.

Preguntas:

  • ¿Es esta vista de MVC fundamentalmente exacta?
  • De lo contrario, explique con cuidado qué componentes están fuera de lugar, dónde deberían ir realmente y cómo deberían interactuar correctamente con los otros componentes (si es que lo hacen).
  • ¿Cuántas clases se usan para describir esto? En mi ejemplo, hay cuatro objetos, uno para cada uno de los tres componentes de MVC y otro que simplemente almacena datos relacionados para la transmisión. ¿Es esto normal o debería combinarse? ¿De ser asi, cuales?

Esencialmente tienes todo en el lugar correcto.

En su ejemplo, define una clase de pregunta, que se conocería como un modelo de vista, simplemente un contenedor para todos los datos que se utilizarán en la vista / recuperados de la vista.

En algunos casos, he visto el ViewModel pasado por alto y el Modelo se pasa a la Vista; esto me confundió cuando estaba mirando por primera vez los tutoriales, y no me gusta omitir ViewModel, creo que confunde las cosas.