Estructura básica de MVC (PHP)

Tengo el siguiente flujo de datos para un formulario de inicio de sesión simple.

Archivo PHP del controlador de acceso de usuario. El controlador incluye model.php y view.php

El usuario envía el formulario, el controlador envía datos POST a los métodos del modelo y obtiene un resultado.

El usuario inicia sesión y el controlador lo reenvía a una vista diferente (mensaje de inicio de sesión exitoso).

Actualmente, mis vistas son HTML estático (sin PHP), así que aquí está mi pregunta. ¿Cuál es la forma correcta de pasarle al usuario un mensaje de bienvenida, por ejemplo, "¡Hola, Craig!"?

¿La vista permite fragmentos de PHP, por ejemplo?

<?php echo $username; ?> 

ya que el modelo se carga antes que él en el archivo del controlador?

¡Gracias!

Edit: ¿Es una mejor práctica entonces permitir que la vista acceda a métodos de clase específicos, por ejemplo?

<?php $user->getUsername(); ?>

en lugar de solo variables?


Basado en otras respuestas, he encontrado un artículo muy útil, que también te puede interesar.

http://www.nathandavison.com/posts/view/7/custom-php-mvc-tutorial-part-5-views

preguntado el 27 de julio de 12 a las 14:07

El contenido dinámico debe pasar de la acción a la vista y mostrarse allí, por lo que se permite usar variables php en las vistas. -

Creo que el modelo contiene la clase si usa oops, puede llamar al método cuando lo desee, por lo tanto, obtendrá los datos del controlador, pero será más complicado y usará más servidor (ya que tiene más consultas) -

2 Respuestas

Aquí hay algunas cosas que debe considerar:

  • No puedes hacer MVC clásico en PHP. en cambio tenemos inspirado en MVC .
  • Existe una relación 1: 1 entre las instancias de vista y controlador, cuando se implementa para web
  • El modelo en MVC no es una clase. Es una capa que contiene muchas clases diferentes.
  • View no es una plantilla tonta, sino una instancia de clase, que se ocupa de la lógica de presentación

Ver en MVC basado en web

Como se indicó anteriormente, vistas en MVC y los patrones inspirados en MVC son responsables de la lógica de presentación. Eso abarca cosas como mostrar mensajes de error y paginación. Para ello, cada vista puede manejar varias plantillas.

View recibe información de la capa del modelo y actúa en consecuencia. La forma en que la información de la capa del modelo termina en las vistas es una de las diferencias más significativas en los patrones similares a MVC:

  • MVC clásico patrón

    Las estructuras de la capa del modelo envían la información a la vista, cuando se ha alterado el estado del modelo. Esto se hace a través de patrón de observador.

  • Modelo 2 MVC y hmvc .

    View tiene acceso directo a la capa del modelo y puede solicitarle información. Este es el más cercano al patrón original.

  • MVVM y MVP .

    La vista recibe información a través del controlador, que a su vez la ha solicitado a la capa del modelo. La diferencia adicional en los patrones se deriva de lo que se hace con los datos antes de pasarlos a la vista.

Lo que parece tener ahora es en realidad solo una plantilla. Similar a uno, que se describe en este artículo. Terminas con una estructura que no tiene lugar para contener la lógica de presentación. A largo plazo, esto hará que la lógica de presentación se inserte en el controlador.

Entonces, ¿qué pasa con ese mensaje de "bienvenida"?

Para mostrar el mensaje de bienvenida, su vista debe solicitar desde la capa del modelo el nombre del usuario actual. Si la capa del modelo devuelve algún tipo de estado de error, seleccione la plantilla de mensaje de error e insértela en el diseño.

En caso de que el nombre del usuario se haya recuperado de la capa del modelo sin problemas, seleccione la plantilla que contendría el saludo, establezca el valor en la plantilla y lo represente.

¿En qué orden se deben cargar las piezas?

La idea de que el controlador debe inicializar el modelo y la vista proviene de una interpretación muy primitiva de MVC para web. Patrón conocido como controlador de página, que intentó injertar MVC directamente en páginas web estáticas.

En mi opinión, este debería ser el orden:

  1. Modelo

    Inicializa la estructura, a través de la cual se ocupará de la capa del modelo. Lo más probable es que sea algún tipo de fábrica de servicios, lo que le permitirá construir cosas como Authentication servicio de inicio de sesión y Library servicio de tramitación de documentos. Ese tipo de cosas. Escribí un poco largo comentar sobre la estructura de la capa del modelo más temprano. Tu podrias encontrar esto útil.

  2. Ver

    Crea una instancia de vista basada en la información que recopiló del mecanismo de enrutamiento. Si está implementando Model2 or hmvc, entonces su vista requerirá una instancia de Fábrica de servicio en el constructor.

    Si está implementando MVVM or MVP, entonces el constructor de la vista no tiene requisitos especiales.

  3. Normativa

    Esta es la última estructura, que crea, porque el controlador es responsable de enviar comandos tanto a la vista como a la capa del modelo, que luego cambian el estado de ambos. Por lo tanto, el controlador debe esperar recibir tanto la vista como la fábrica de servicios en el constructor.

Una vez que se han inicializado los elementos básicos de MVC, llama a un método en el controlador y representa la vista actual.

Solo tenga en cuenta que esta es una descripción muy simplificada.

contestado el 23 de mayo de 17 a las 12:05

"Por lo tanto, el controlador debe esperar recibir tanto la vista como la fábrica de servicios en el constructor". Solo para aclarar, quiere decir que el controlador debe ser responsable de instanciar (suponiendo OOP) el modelo y la vista, pasándoles ambos parámetros de la ruta, ¿verdad? - Sam Selikoff

@SamSelikoff, no estoy seguro de lo que entiendes por "ruta", pero: NO, el controlador no inicializa las vistas ni las estructuras de capas del modelo. La vista se inyecta en el controlador y la inicialización de los elementos de la capa del modelo se realiza en la fábrica. - tereško

@tereško entiendo que para Model 2 MVC el View interactúa con la capa del modelo, pero ¿por qué es esto a través de la ServiceFactory? ¿No es el propósito de un ServiceFactory para construir ciertos servicios tales como AuthenticationService, y entonces retorno el objeto construido al controlador, donde luego se invoca? ¿Por qué el View necesita el ServiceFactory - No debería estar construyendo nada, ¿verdad? Solo necesita datos de servicios particulares.. - tgun926

@ tgun926 bueno... esto probablemente será bastante confuso, pero aquí vamos. Los servicios en sí se utilizan para contener la *"lógica de la aplicación"* (básicamente: la interacción entre el dominio y las abstracciones de persistencia). El uso de ServiceFactory en este contexto es en realidad una solución. Ver no necesita la fábrica. Eso Realmente necesita el AuthenticationService instancia, que comparte con el controlador. Para facilitar dicho intercambio de forma orientada a objetos, tiene dos formas: inicializar la instancia "fuera" y pasarla para ver los objetos del controlador OR .. - tereško

@tgun926, sí. En la implementación más simple, podría verse como en el ejemplo de código, aquí: stackoverflow.com/a/15959396/727208 ... pensé que en una situación del mundo real sería un poco más complicado. En una nota diferente:, cuando trabaje con código adherente a OOP, notará que es mejor usar espacios de nombres Services\Authentication en lugar de AuthenticationService sufijos Facilita la carga automática. - tereško

Realmente puede poner cualquier cosa en la vista que desee, pero para adherirse mejor a la forma de hacer las cosas de MVC, debe restringir PHP en la vista a simple echos o prints (posiblemente también bucles muy pequeños, aunque incluso esos pueden calcularse previamente en el controlador/modelo). Dado que esa es la única forma de obtener contenido dinámico, sería un poco tonto decir que no están permitidos.

La idea de la vista es dejar que tenga una apariencia más HTML, de modo que los desarrolladores front-end o las personas que no conocen PHP puedan trabajar fácilmente con el archivo sin confundirse.

Noticias

Para obtener más información sobre MVC en general, puede ver cualquiera de estos (hay un montón de tutoriales por ahí):

http://blog.iandavis.com/2008/12/09/what-are-the-benefits-of-mvc/

http://php-html.net/tutorials/model-view-controller-in-php/

http://www.tonymarston.net/php-mysql/model-view-controller.html

Para ver ejemplos concretos de PHP usando MVC, sugiero descargar algunos de los marcos más importantes (como CodeIgniter, Symfony or Drupal) y simplemente mirando el código. Intente descubrir cómo funciona y luego recree la funcionalidad para un sistema simple basado en artículos.

Respondido 27 Jul 12, 15:07

por supuesto. Se trata de separar las preocupaciones, porque ni tú ni nadie más sabe lo que sucederá en el futuro (puedes perder gente en tu proyecto o decidir que es más barato mejorar a alguien que solo sabe HTML). Además, la arquitectura se presta a una mayor seguridad al permitir estrictamente que solo cierta información llegue a la capa de presentación. - jeff lamberto

¿Cómo precalcularía el controlador/modelo los bucles sin violar SRP de alguna manera la vista puede usarlo? - PeeHaa

@Mayankswami Hagas lo que hagas, no uses Codeingiter como guía si quieres aprender de la manera correcta. Es posible que desee mirar Symfony2 es uno de los mejores (menos malos) que hay. - PeeHaa

-1 por sugerir piezas de código tan horribles como codeigniter y drupal. Y enlaces a tutoriales que tergiversan el patrón MVC. - tereško

Además, ¿por qué te vinculaste al sitio de Symfony 1.x? Déjame adivinar, habías escuchado que "Symfony está bastante bien" de los desarrolladores, pero no sabías cuán diferentes son las versiones 1.x y 2.x. - tereško

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.