2009-10-11 20 views
5

Estoy relativamente bien versado en el diseño de sitios web. Principalmente uso LAMP, donde ya tengo un pequeño "framework", que uso. En resumen, separa la lógica del diseño y básicamente tengo un archivo lógico para uno o varios archivos de diseño, dependiendo de qué vistas sean compatibles con el diseño. Hay una sección de administrador y hay autenticación de usuario y todo eso. Multa.PHP MVC - ¿Cómo diseñar?

Por lo tanto, cuando busco ser más elaborado en mi forma de diseñar/programar en PHP o en la programación de sitios web en general, me pregunto cómo "pensar" MVC correctamente. Me estoy inclinando hacia este camino, ya que mi marco actual está muy orientado a DB y se ha vuelto algo pesado donde el rendimiento es esencial.

Así que aquí es mi pregunta: Estoy en lo cierto al suponer que un controlador corresponde típicamente a una "sección" o "página" y una vista se encarga de mostrar que el controlador, y que un modelo maneja los objetos utilizados por el controlador y se muestra en las vistas?

Tomemos un ejemplo (no demasiado elaborado, pero lo suficiente como para ver si mi pensamiento es válida):

Digamos que tenemos un sitio web sencillo juegos. Las secciones normalmente sería algo así como: portada, juegos, foros, y sobre/renuncias etc.

Los clases de controlador corresponde a las secciones, pero se hace un poco más elaborado para cubrir la "instancia única" versión de la objeto cubierto por la sección es decir, la sección de juegos se convierte en dos controladores; uno para descripción general de los juegos (lista de juegos) y otro para la página del juego en sí. El conjunto sería algo así como portada, descripción general de los juegos, página de juegos, foros, foro, página de temas, acerca de, y descargo de responsabilidad.

El vistas puede tener varios diseños para cada controlador, p. al igual que los controladores, pero tal vez varios tipos de vistas en las páginas de los foros (dependiendo de cómo quiera verlas) y páginas de juegos (tal vez una vista de punta más alta), y así sucesivamente.

El modelo (o DataObjects) son típicamente los usuarios, juegos, foros, temas, mensajes, y luego un montón de objetos de ayuda como las etiquetas temáticas, mejores puntuaciones del juego y lo que no debe hacer que los temas posibles para categorizar y los juegos capaz de tener puntuaciones más altas, etc.

Es la forma de pensar "correcta" anterior o estoy totalmente mal entendiendo todo el concepto de MVC para sitios web.

Estoy pensando en mudarse a CodeIgniter o algún otro marco de la luz (no dude en comentar sobre la elección marco o si es mejor ir por mi cuenta) desde mi propio marco es muy orientado DB-y no es así enfriamiento ahora que algunos de mis sitios superan las 70,000 páginas vistas por día.

Un sincero agradecimiento a todos aquellos que pueden ayudar en la respuesta de si o no mi opinión sobre MVC es algo correcto y también, si es posible, añadir algunas pistas de lo que pensar cuando la codificación MVC y todavía quieren mantener el corte rendimiento extremo (tanto como sea posible con los lenguajes guionados).

+2

¿Por qué no usar zend por ejemplo? –

+1

zend? ¿ligero? ¿alto rendimiento? No lo creo. La pregunta realmente no es sobre qué marco, sino más bien si estoy pensando en MVC correctamente en un entorno web. Pero gracias de todos modos. – Adergaard

+2

Si el servidor está configurado correctamente y puede lograr un sitio web de alto rendimiento con Zend, no hay problema, pero debo decir que, de entrada, puede haber algunas cosas que afecten el rendimiento. – ChrisR

Respuesta

3

En primer lugar, esto no es una pregunta específica de PHP, sino una pregunta sobre cómo aplicar el patrón MVC a la web programación. Y, de hecho, el patrón MVC tiene tanto sentido en el área de desarrollo de aplicaciones web que casi se ha convertido en un imperativo en este campo de aplicación.

Ahora, en cuanto al patrón MVC en sí, encontrará muy buenas respuestas en SO ya. Por ejemplo, la pregunta y respuestas de What goes into the controller.

En cuanto a la cuestión de cómo asignar la estructura de su sitio web a la arquitectura de su controlador, recomendaría lo siguiente.

  • no trate de trazar su navegación, sino más bien la lógica de aplicación
  • un controlador para cada unidad lógica de las funciones
  • dentro de los controladores, un método público para cada vista
  • controladores más magras cuales principalmente juega gateway entre modelos y vistas

Por ejemplo, si en su caso gameoverview es solo una lista, no necesita su propio controlador, sino que es solo un método en el indexcont rodillo que obtiene la lista del modelo y la envía a la vista respectiva. Pero si su vista de juego es un mecanismo complejo con muchas posibilidades y diferentes subvistas, etc. podría tener un controlador general con varios métodos para las diferentes vistas y tareas.

Realmente recomiendo mirar en Zend Framework y cómo estos problemas se resuelven allí. OMI puede aprender mucho sobre el tema de su pregunta haciendo eso.

+0

Buena respuesta, estoy usando CodeIgniter. ¿Zend Framework es mejor que CI? ¿Tiene en cuenta el rendimiento? ¿Puede sugerirme el marco correcto para usar en función de su experiencia? Gracias :) –

+0

Gracias, he leído los comentarios en la respuesta a continuación :) –

0

Wikipedia es probablemente mejor para explicar esto, pero básicamente,

su modelo representa, y los resúmenes, los datos subyacentes (por ejemplo, proporciona una capa de abstracción de lo que los otros elementos no tienen que interactuar con la base de datos .. . o incluso saber que está allí).

su controlador maneja las solicitudes para cambiar el modelo.

su vista es la visualización de una parte del modelo y la respuesta del controlador.

Ni el controlador ni el modelo deben manejar la pantalla. monitor. Ni el modelo ni la vista deben manejar los datos POST entrantes o similares. Ni el controlador ni la vista deberían tratar con las fuentes de datos.

ver http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller#Description para una buena descripción de las funciones.

Lo que describes en la pregunta no se ajusta a esta descripción. Debería haber, por ejemplo, un controlador por clase de modelo (o menos) para manejar las solicitudes a los elementos que esas clases de modelo representan.

Sus vistas no deben vincularse explícitamente a ningún controlador o elemento de modelo. la vista representa un subconjunto del modelo como un todo.

La única interacción entre una vista y un controlador es la visualización de comentarios.

Espero que eso ayude.

EDITAR: Como otros han señalado, hay una serie de marcos MVC ya construidos. (Consulte el http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller#PHP para obtener una lista) y desaconsejaría estar demasiado apegado a un marco que ya haya construido si hay otro que lo haga mejor.

1

CodeIgniter es una gran herramienta para los principiantes MVC, Yo sugeriría nos fijamos en net.tutsplus.com hay un tutorial de vídeo en curso sobre CodeIgniter

añadió

para principiantes que quieran sumergirse en CI, enlaces a videotuts:

añade

No recomiendo CI tan grande y un marco de gran alcance, pero es simple para principiantes y pueden aprender mucho de ella, personalmente estoy a favor de Symfony y Yii

+0

No recomiendo CI, es un marco muy restrictivo que pone cadenas en sus manos para el uso avanzado y está orientado hacia PHP 4 que lo limita fuertemente. – markus

+0

Lo sé, pero simplifica la estructura para un principiante en marcos MVC. Después de un fw tan simplista y limitado, un programador puede pasar a cosas más avanzadas como Symfony o Yii –

+0

de acuerdo, ese es un buen punto. Simplemente no recomendaría a nadie invertir tiempo en CI si no lo van a usar más adelante. Leer Symfony o Zend Framework hará el mismo trabajo al explicar la estructura de MVC más el tiempo invertido podría dar resultado porque en realidad usará los marcos. – markus