Marco de php más estricto de MVC [cerrado]

8

He estado tratando de entender el patrón MVC durante aproximadamente 6 meses. He leído toneladas de artículos, preguntas y respuestas y publicaciones de blog sobre patrones MVC y HMVC, pero simplemente no lo entiendo al 100%.

Intenté aprender MVC ejercitando uno de los framework PHP MVC ampliamente utilizados, CodeIgniter. He implementado algunos sitios web internos para mi empresa con él. Y TODAVÍA, no lo entiendo al 100%. Creo que una de las mejores maneras de aprender algo es seguir reglas estrictamente definidas.

Entonces mi pregunta es: ¿Cuál es el marco PHP más estricto en términos de cómo se implementa el patrón MVC? ¿Uno que defina cómo uso los modelos, los controladores y las vistas para poder entender completamente qué es MVC?

kidonchu
fuente

Respuestas:

13

Respuesta corta

No existe tal cosa.

Versión más larga:

Los marcos no implementan patrones de diseño inspirados en MVC o MVC. Tu aplicación lo hace.

MVC no es una salsa mágica, que puede agregar a su aplicación volcándola en un marco. En cambio, tendría que aprender y comprender dicho patrón (y los principios y prácticas que lo acompañan, como SOLID , LoD , SoC ) . Solo entonces puede intentar usarlo dentro de un marco de su elección.

Si un marco anuncia que "tiene MVC" , entonces es completamente pronuncian ños . En esa situación, se utiliza para "vender" el marco a los novatos que se preocupan más por el último despliegue publicitario que por el diseño de aplicaciones y las prácticas de codificación.

El objetivo de un marco sería proporcionarle una colección de herramientas que, cuando se usan como un todo, le brinden un entorno de desarrollo alterado / mejorado. Se ocupan de cosas como enrutamiento, carga automática, abstracciones de bajo nivel para el almacenamiento (no, no estoy hablando del antipatrón de registro activo) y el resto de cosas que le permiten ahorrar tiempo en el desarrollo y mantenimiento de boh.

En conclusión.

No hay marcos MVC en PHP. Todos los que me reclaman eso están entre los peores. A saber: codeigniter, cakephp y yii. Evítelos a toda costa (excepto si le pagan muy bien por ello).

Si necesita usar un marco, actualmente sus mejores opciones serían la última versión de Symfony 2.x, Zend Framework 2.xo Laravel 4.x. Estos no implementarán MVC para usted, sino que harán el menor daño para su propia arquitectura de aplicación.

mefisto
fuente
77
-1 Claramente, algunos marcos son más adecuados para MVC que otros. Por lo general, son los que incluyen modelos, vistas y controladores.
Rein Henrichs
77
El modelo no es una clase. Es una capa de aplicación. Si tiene un marco que tiene "modelos", entonces es una indicación clara de que ni siquiera está remotamente relacionado con el patrón de diseño MVC o los conceptos en los que se basa MVC.
mefisto
77
... es una capa de aplicación que necesita ser reificada de alguna manera. En un lenguaje OO que generalmente significa usar objetos, lo que significa usar clases. En cualquier caso, no estoy interesado en relacionarme con alguien tan abiertamente grosero y hostil hacia las ideas de los demás, así que lo dejaré solo.
Rein Henrichs
66
-1 El OP estaba pidiendo un marco que aplicara estrictamente el uso del patrón MVC en la aplicación que usa el marco. Su respuesta fue sobre el "mejor" marco y la filosofía sobre los marcos en general y no respondió la pregunta del OP.
programador el
3
+1 Llegué esencialmente a la misma conclusión a lo largo de los años. Cake & co son los peores delincuentes; es posible que pueda obtener algo MVCish de ellos si los golpea el tiempo suficiente, pero realmente no están diseñados para el diseño MVC real. De hecho, la mejor opción son los marcos, que son solo una colección suelta de componentes y le permiten implementar su propia aplicación utilizando sus herramientas generalizadas.
deceze
7

Solo puedo hablar con Cake, y no tengo nada bueno que decir al respecto en términos de MVC. Ellos no hacen MVC derecha. Codeigniter está muy en la misma línea. No es extraño que no hayas "MVC" incluso después de haberlo usado por un tiempo.

MVC consiste simplemente en separar adecuadamente tres componentes distintos de la lógica de su aplicación: el núcleo de la aplicación , la presentación y el pegamento necesarios para que ambos funcionen en un contexto del mundo real.

El núcleo de su aplicación, que contiene toda la lógica de negocios, interacción con la base de datos, servicios, pitidos y boops que hacen de su aplicación "su aplicación" son el modelo. El modelo no es una cosa específica en una forma específica, es lo que sea necesario para que su aplicación funcione de la manera en que lo hace. Solo tienes un "modelo", que es tu aplicación.

La vista se utiliza para generar de alguna manera lo que hace su modelo. Es la interfaz de usuario. Es lo que sea necesario para mostrar información útil al usuario. Este puede ser un sitio web, puede ser una interfaz de línea de comandos, puede ser una GUI de escritorio nativa. Puede usar los tres en su aplicación.

El controlador es simplemente lo que queda para que funcione, principalmente lo que toma la entrada del usuario y la dirige al lugar apropiado. Puede tener varios tipos diferentes de controladores para diferentes tipos de contexto, por ejemplo, uno que pueda manejar las solicitudes HTTP entrantes, uno que maneje la entrada de la línea de comandos y otro que esté conectado a los eventos de la GUI.

La forma particular que toman estas partes individuales depende completamente de su aplicación. Los tres pueden ser una especie de miniaplicaciones propias. Cualquier "modelo" de marco prefabricado de plantilla está hecho para un caso generalizado para ayudarlo a poner en marcha algo rápidamente; a menudo no es la forma óptima que debería tomar su modelo. Tendrá que crear su propia estructura para su aplicación , lo que sea más adecuado para construirla. Examine los principios de OOP, SOLID, inyección de dependencia, etc. y construya su modelo central de acuerdo con estas pautas. Luego, ajuste las vistas y los controladores a su alrededor según sea necesario.

El objetivo de esta separación es simplemente hacer que la aplicación sea mantenible y ampliable. El modelo no contiene nada específico de ninguna forma específica de entrada o salida. Por ejemplo, no contiene ningún texto de formato específico (como mensajes de error en formato HTML). No asume ninguna forma particular de entrada (como las solicitudes HTTP). La Vista, por el contrario, no contiene ninguna lógica de negocios, su trabajo es solo la salida . Y el controlador tampoco contiene ninguna lógica de negocios, su trabajo es solo "ingresar" . La razón es simplemente que tanto el controlador como la vista son intercambiables, pero su aplicación no lo es.

Si desea usar un marco para esto, use uno que sea modular y le permita hacer lo que necesite hacer. Zend, Symfony, Laravel y los marcos de pick-and-choose basados ​​en componentes similares son los más adecuados para esto.

difunto
fuente
¡Gracias por aclarar algunas dudas! De alguna manera entendí lo que quieres decir cuando leí esta línea. tanto el controlador como la vista son intercambiables, pero su aplicación no lo es. Sin embargo, una pregunta: en cualquier estructura de carpetas de marco, hay una carpeta llamada 'modelos'. Si 'mi aplicación' en sí misma es el 'modelo', ¿cómo deberían llamarse realmente los que están en esta carpeta 'modelos'?
kidonchu
Una pregunta más ... ¿se considera que este tutorial es similar a su comprensión del patrón MVC? Parece que tienen algo en común, pero no estoy seguro; especialmente, el comentario del administrador sobre tener todas las lógicas en un modelo con muchas clases de entidades, este enlace .
kidonchu
Acabo de leer ese tutorial, pero parece más acorde con el MVC "real". El modelo parece un poco delgado, pero con suerte solo porque es solo un ejemplo. Sí nombro mi modelo de carpeta "modelo", pero dentro de él creo varias subcarpetas; normalmente al menos distingo entre "primitves" (me gusta Book), servicios ("acciones", me gusta collateBookCollection) y almacenamiento ( saveBookToDatabase). Lo que debe tener cuidado es que no ponga demasiado código en el controlador, que es algo que Cake & co. equivocarse completamente Haz que tu modelo sea realmente gordo.
deceze
Yo llamo el mío domain: p
Esailija
7

Tal marco no puede existir por varias razones.

En primer lugar, el Modelo en el patrón MVC es la parte que hace que su aplicación sea su aplicación. Si un marco definiera estrictamente el aspecto de un modelo, entonces ese marco solo sería utilizable para una o, como máximo, un puñado de aplicaciones. Esto efectivamente impide que sea un marco.

El segundo problema es que no existe un consenso universal sobre cómo se ve una aplicación adecuada del patrón MVC. Por ejemplo, algunos dirán que el Controlador debe proporcionar a la Vista los datos que necesita del Modelo, mientras que otros dirán que la Vista debe recuperar la información que necesita por sí misma y el Controlador debe asegurarse de que la Vista sepa dónde Encuentra el modelo.
Otro ejemplo, más específico para las aplicaciones web, es la cantidad de procesamiento que puede hacer la Vista. Para algunos, la Vista debe consistir exclusivamente en archivos HTML donde algunos marcadores de posición se reemplazan con el contenido real (generalmente recuperado por el Controlador del Modelo), mientras que otros se sienten perfectamente cómodos al permitir que la Vista realice el procesamiento relacionado con la interfaz de usuario, como la internacionalización del contenido presentado.

Bart van Ingen Schenau
fuente
1
Veo. Creo que una vez vi esta cita "Si preguntas 'qué es MVC' a diez personas diferentes, obtendrás diez respuestas diferentes". Supongo que eso es lo que significa tu segundo punto.
kidonchu
@kidonchu: Eso es parte de eso, aunque tampoco debería sorprenderte obtener 11 respuestas diferentes de esas 10 personas ;-)
Bart van Ingen Schenau
2

Entiendo que esta publicación tiene un año, lo que es irónicamente la razón por la que estoy publicando esta respuesta. En primer lugar, algunas de las personas que respondieron a esta pregunta tienen razón. Realmente nunca vas a encontrar un Framework PHP que venga "listo para MVC" desde el primer momento ... necesariamente. Ya que se supone que el marco es una base donde los desarrolladores pueden construir sobre él, siguiendo MVC. Sin embargo, en el último año desde que esto se publicó, algunos de los frameworks de PHP han recorrido un largo camino.

Jugué un poco con CakePHP por un momento, incluso hasta el día de hoy es una configuración horrible y desordenada de directorios y estructura, no hay una distinción clara entre la lógica, tiene un código bastante poco comentado y todo está un poco agrupado en un solo paquete lío. Eso no es una queja sobre CakePHP, eso es simple verdad.

Zend, es excelente. Proporcionan excelente documentación y comentarios de código, tienen una comunidad muy amigable y proporcionan un marco muy agradable para desarrolladores principiantes e intermedios. Han recorrido un largo camino desde que el OP publicó esto.

Y para las personas que dicen que no existe ese marco para responder la pregunta del OP, tienen razón como dije anteriormente. Sin embargo, también están equivocados. Zend, Laravel y CodeIgniter son marcos asombrosos, y aunque no te "dan" MVC, definitivamente te allanan el camino como desarrollador para crear aplicaciones MVC bellamente construidas, teniendo en cuenta que tú, como desarrollador, sigues un buen MVC prácticas

Para aquellos en este hilo que dicen que CodeIgniter es horrible. Estás bastante equivocado, al menos para los estándares de hoy. En el momento de esta publicación, no estaba en los marcos, así que no lo había mirado entonces. Por lo tanto, en ese momento podría haber sido horrible. Pero lo uso TODAS mis aplicaciones web ahora. Hacen un gran trabajo al crear un marco sólido con una estructura de directorio comprensible, así como también le brindan algunas herramientas increíbles para comenzar a MVC. Hacen un gran trabajo en la distinción lógica, tienen una comunidad increíble de soporte y, en general, proporcionan un marco excelente y gratuito que, una vez más, si sigues las buenas prácticas de MVC, puede convertirse en algunas aplicaciones increíbles.

Al punto principal. Quería interponer mi opinión sobre este tema. Nunca encontrará ese marco perfecto, construido por MVC y listo para usar . Sin embargo, si utiliza buenas prácticas de MVC y elige un marco sólido como Zend, Laravel y / o CodeIgniter, estará bien. Debido a que la verdad es que el MVC depende del desarrollador cómo implementa la buena práctica y no el marco. El marco ofrece la base, el resto depende del desarrollador.

Buenos marcos para usar como referencias

  • CodeIgniter
  • Marco Zend
  • Laravel
  • Symfony 2 (agregado después de leer el comentario, porque también es un excelente marco)

Solo recuerde cuando use estos, depende de usted como desarrollador seguir las buenas prácticas de MVC. Hay toneladas y toneladas de tutoriales sobre buenas prácticas de MVC. Me topé con el sitio web de un caballero que tiene algunas pautas increíbles , y apunta hacia un MVC adecuado, y hasta ahora sus publicaciones en el blog han sido bastante buenas, y es un gran lugar para comenzar a aprender.

Referencia

Jason
fuente
Entiendo que esta publicación tiene un año, lo que es irónicamente la razón por la que estoy publicando esta respuesta. La pregunta ahora se considera fuera de tema y he votado para cerrarla como tal. Una de las razones por las que ahora consideramos publicaciones como fuera de tema es precisamente porque la información está desactualizada tan fácilmente.
Martijn Pieters
Me preguntaba por qué dejaste Symfony 2. Luego vi la referencia a Tommy y todo quedó claro.
Cerad
Tienes razón. Olvidé a Symfony. Siempre lo olvido porque rara vez lo uso. Pero tengo curiosidad, ¿cómo "dejó en claro" mi referencia a Tommy? ¿Qué significa eso = P
Jason
Bueno, digamos que hace unos años, Tom molestó a uno de los desarrolladores más serios que el desarrollador sacó su lata de repelente de insectos. Tom es divertido de leer pero vive en una realidad diferente.
Cerad
No estaré en desacuerdo allí lol. Es exigente y muy interesante y definitivamente vive en su propia realidad. Pero admiro su serie Model View Confusion. Y para mí, él tiene un gran enfoque en MVC adecuado. Pero esa es solo mi opinión. Gracias por la aclaración @Cerad
Jason
1

Parece que solo tienes problemas para "armarlo todo" porque muchos tutoriales no explican bien MVC de una manera clara. Le recomiendo que se "ensucie" las manos y cree una aplicación simple con entre 3 y 5 marcos diferentes para ver cómo suelen abordar el problema. Algunos tienen documentación sobre cómo configurar la arquitectura MVC básica para una aplicación y, si no lo hacen, siempre puede buscar en Google un par de tutoriales de mvc para ese marco en particular.

FWIW Me gustó la recomendación de diseño de proyecto / directorio de Zend: http://framework.zend.com/manual/1.12/en/project-structure.project.html

También eche un vistazo a "El marco PHP MVC sin marco" de Rasmus. Demuestra que realmente no necesita un marco, simplemente puede crear uno propio para satisfacer sus necesidades específicas. ¡Además, disfrutarás de los comentarios! http://toys.lerdorf.com/archives/38-The-no-framework-PHP-MVC-framework.html

programador
fuente
Sí, admito que no puedo reunir a todos en una sola pieza. Sin embargo, su enlace al artículo de Rasmus despejó algunas dudas. Especialmente la idea principal, "no es necesario un marco para implementar el patrón MVC". ¡Gracias!
kidonchu