2010-05-18 15 views
61

Algunas personas consideran que WordPress es una plataforma de blogs, algunos piensan que es un CMS, algunos se refieren a WordPress como un marco de desarrollo. Cualquiera que sea, la pregunta aún permanece. ¿Cumple WordPress MVC?¿Cumple WordPress MVC?

He leído los foros y alguien me preguntó acerca de MVC hace unos tres años. Hubo algunas respuestas positivas y algunas negativas. Aunque nadie sabe exactamente qué es MVC y todos lo piensan a su manera, todavía hay un concepto general presente en todas las discusiones.

Tengo poca experiencia con frameworks MVC y no parece haber nada sobre el framework en sí. La mayor parte del MVC lo hace el programador, ¿estoy en lo cierto? Ahora, volviendo a WordPress, ¿podríamos considerar el motor de reescritura principal (WP_Rewrite) del controlador? Pregunta & ¿lógica del complemento como modelo? Y los temas como la vista? ¿O lo estoy entendiendo todo mal?

Gracias;)

+1

MVC es un patrón de diseño arquitectónico e independiente del tipo de descargas. Cualquier plataforma de blogs, CMS o framework de desarrollo podría ser MVC, dependiendo de cómo esté estructurada. – eKek0

+0

eKek0, pensé que sí. Pero bueno, debería haber algunos ejemplos de CMS y frameworks que no son compatibles con MVC, es decir, su arquitectura central no es MVC en absoluto. ¿Podrías pensar en alguno? – kovshenin

Respuesta

45

Wordpress en sí no está diseñado en MVC, pero se pueden crear temas y complementos muy MVC en el marco. Hay varias herramientas que pueden ayudar:

soluciones

WordPress MVC:

hilos de MVC en ideas WordPress.org y Trac:

+1

Las ideas de MVC parecen ser muy impopulares: casi todas son rechazadas a muerte. – Hexodus

9

Como ya se ha mencionado en los comentarios, MVC es un patrón de diseño arquitectónico, no un marco específico, y no, Wordpress no sigue el patrón MVC.

Hay una separación de vistas (plantillas) de la lógica de programación, pero solo en la interfaz, no en el panel de administración y una separación general de vistas y la lógica de la aplicación no es inevitablemente MVC. Una implementación del patrón MVC suele asumir algún tipo de paradigma de programación orientado a objetos detrás de él y Wordpress es principalmente implementado de forma procedural, con consultas SQL simples en las funciones de PHP, por lo tanto, tampoco tiene un modelo real.

24

Wordpress es kinda-sorta MVC. En todo caso, es un diseño de MVC de tipo pull, donde la vista 'extrae' datos del modelo. Hace esto de una manera muy práctica, en lugar de usar muchos objetos diferentes, pero esto realmente hace que las plantillas de front-end sean más fáciles de escribir de muchas maneras.

Esto también le da a los puntos de vista cierto grado de lógica del controlador (por lo tanto, el MVC algo así).

Permite ejecutar esto: Wordpress obtiene una URL. El núcleo de wordpress actúa como controlador y determina qué consultas iniciales se ejecutarán en la base de datos y, por extensión, qué vista se debe cargar (vista de categoría, publicación única o vista de página, etc.). A continuación, empaqueta esa respuesta de consulta INTIAL y la envía al archivo de vista.

Ese archivo de visualización PUEDE ser un archivo de visualización estricta o puede solicitar información adicional/consultas más allá de la incorporada. Este es el tipo de arrastre del MVC, donde la vista extrae datos del modelo en lugar de que el controlador "empuje" los datos del modelo a la vista.

Por lo tanto, cuando la vista ve código para cargar una barra lateral o área de widget, solicita esa información. Sin embargo, lo que los widgets deberían estar ahí está determinado por el controlador, que mira el modelo para ver qué widgets hay en la barra lateral y luego selecciona aquellos que están configurados para mostrarse en la página actual y los devuelve a la vista.

Que cada parte de eso no sea un objeto no lo hace menos MVC. Puedes alterar el núcleo de WP sin alterar (necesariamente) nada sobre un tema. Del mismo modo, siempre que utilice funciones integradas como 'get_pages()', el modelo y las tablas de la base de datos podrían cambiar siempre que esas funciones devuelvan los datos correctos. Entonces, el modelo es independiente de la vista, y el controlador también es independiente (excepto cuando la vista agrega lógica de controlador para hacer más de lo que normalmente hace el núcleo).

Si bien PODRÍA tener un objeto modelo con varios métodos y cosas como WPModel :: get_pages ('blah blah'), y contiene todo de esa manera, todavía hay una separación fundamental de preocupaciones.

Ver: archivos de plantilla Controlador: WP core Modelo: las distintas funciones que manejan el manejo de datos específicos.

Mientras los nombres, argumentos, etc. permanezcan igual (o simplemente que se agreguen nuevos), entonces la separación de las preocupaciones se mantiene y se puede modificar sin molestar a los demás.

No es una versión súper limpia de MVC, (especialmente cuando los ganchos se involucran), pero en un nivel básico comienza allí.

Y siendo procedural al respecto no es algo malo IMO. Una solicitud de un sitio web es bastante inherente procedural: es un proceso con un principio y un final claros, y solo necesita un procedimiento para procesar la solicitud, obtener datos, empaquetarlo y luego morir. Puede configurar esos pasos con objetos y métodos de objetos y diseños OOP (lo que facilitaría algunas cosas) o puede simplemente escribir muchas llamadas a funciones y separarlas de esa manera. Los miembros de la clase, como las variables privadas, se pierden de esa manera, pero dependiendo de las necesidades de la aplicación ... es posible que no le importe.

No hay una gran manera de hacer desarrollo, y WP se encuentra en un 20% de sitios web, por lo que está haciendo algo bien. Probablemente tenga algo que ver con no hacer que la gente tenga que aprender/memorizar jerarquías de clases complejas para que la base de datos responda la pregunta '¿qué páginas son secundarias de la página x?' y tratar con esa información. ¿Podrías hacerlo tan fácil con OOP? sí, pero si Joomla es un ejemplo de lo difícil que es implementar un sitio web personalizado complejo con OOP, entonces WP es mucho más fácil y rápido, y el tiempo es dinero.

+0

Estoy comentando sobre mi propia escritura aquí. Wordpress no es MVC solo. De hecho, los patrones de diseño que aborda desde el primer momento definitivamente no son MVC en absoluto. Normalmente utilizo los archivos de vista como page.php como un tipo de controlador de script (preparación de variables, lógica comercial, etc., y hablando con el DB si es necesario) y luego cargo un archivo de vista separado, p. page-view.php. Lo he estado haciendo de esa manera por un tiempo, me olvido de lo complicado que es el código WP normal hasta que veo las cosas demasiado complicadas que hay por ahí. – Rampant

2

RokkoMVC es una estructura micro MVC diseñada especialmente para WordPress. El proyecto está destinado a simplificar la funcionalidad de AJAX en las aplicaciones de WordPress, así como a incorporar todos los demás beneficios de usar modelos, vistas y controladores a su tema.

5

Simplemente para actualizar esto con información más reciente para las personas que aciertan a esto desde los motores de búsqueda: el plugin wp-mvc http://wordpress.org/extend/plugins/wp-mvc/ hace mucho para crear un marco mvc para el desarrollo de complementos. Puede encontrar más información aquí: http://wpmvc.org/documentation/70/tutorial/

+1

Se ve bien, pero las últimas actualizaciones de código tienen 2 años. ¿Este proyecto aún está vivo? – Hexodus

4

sólo para añadir a la lista de opciones, (estoy ciertamente parcial, ya que el autor,) swpMVC es un marco con todas las funciones, ligero MVC, inspirado en los carriles, Sinatra, Express, y FuelPHP. Está completamente documentado, y aunque he usado y disfrutado el wp-mvc, quería algo en que los modelos pudieran poblar las vistas, incluidos los controles de formulario para interactuar con dichos modelos.

Lo puse en gran medida para reducir la cantidad de código de controlador necesario para armar una aplicación encima de WordPress, y el resultado es un marco muy rápido y eficaz que se ejecuta dentro de WordPress. Los modelos se basan en PHP Activerecord y se incluyen 8 modelos para los tipos de datos de WordPress existentes, incluidos Post, PostMeta, Usuario, UserMeta, Término y algunos más. Modelar datos es muy fácil gracias a la biblioteca activerecord, y he disfrutado trabajar con este framework inmensamente hasta el momento.

también viene con PHP subrayado y PHP Profiler rápida (como se ve en FuelPHP.)

+1

¡Guau, buen trabajo, Brian! Marco muy bueno, lo intentaré. – Hexodus

1

que tenía una fiesta recientemente en la creación de un plugin que hace uso de un sistema simple vista-controlador, y gustó bastante los resultados, así que separé el material de la plantilla to its own repo. Ofrece controladores basados ​​en objetos, pasando variables localmente a plantillas PHP, fragmentos de plantilla (plantillas dentro de plantillas) y componentes (fragmentos de plantilla con su propio subcontrolador). ¡Todo en dos clases pequeñas!

Por supuesto, escribí este código pensando que ningún otro desarrollador de WP había considerado el problema antes de ;-).

0

Está lejos de mvc, no hay nada como dicen algunas personas, es MVC o no ... El hecho de que escriba lógica en el nivel de vista no lo califica como un marco de mvc. La razón por la que la gente lo usa es fácil de aprender, no necesitas ser un programador de php duro, son flojos.

+1

WordPress está lejos de ser "fácil de aprender" para usarlo correctamente, y IMO es * porque * no usa un patrón MVC. Es una mezcla de muchas técnicas y patrones de diseño introducidos a lo largo de los años, con compatibilidad heredada que frena cualquier revisión importante. La base del código puede ser un campo minado para negociar, y "el perezoso" tendrá muchos problemas, como sucederá con cualquier marco. – Jason

+0

Es fácil de aprender, en comparación con Zend u otros marcos adecuados como CI ... Incluso las convenciones de nomenclatura dejan mucho espacio para mejorar. ¡¡Venga!! – lokers

+1

Tiene usted razón: WP no es un MVC. Acabo de comenzar con WP y la primera mirada dentro de los archivos de plantilla de un tema muy famoso me asustó: esto se parece al estilo de codificación utilizado por la gente hace 10 años: html, php, css, todo mezclado. La lógica empresarial y la representación de pantalla están en un solo lugar. No me malinterpreten - WP es muy bueno, pero necesita una reescritura en mi humilde opinión. – Hexodus

4

Uno de los temas que periódicamente aparece en las discusiones en lo que se refiere a WordPress es la idea de WordPress y MVC.

Pero la cuestión es que MVC no es la bala de plata del desarrollo web que tratamos de hacer. Sí, es un patrón de diseño impresionante, y personalmente creo que se ajusta al modelo de aplicación web como un guante, pero no todos los marcos o plataformas implementan ese patrón de diseño.

Caso de ejemplo: WordPress no es MVC.

Y eso está bien. Creo que tenemos que dejar de lado el deseo de tratar de calzarlo en nuestros proyectos, especialmente cuando el patrón que proporciona WordPress no solo es suficiente, sino que funciona bien cuando se apalanca correctamente.

“Pero amo el MVC!”

yo también! De hecho, pasé el último año trabajando en un proyecto que más o menos imitaba la arquitectura MVC. Un ejemplo de alto nivel de MVC.

enter image description here

Un ejemplo de alto nivel de MVC.

Por ejemplo:

Views were implemented using templates 
Controllers were implemented by a combination of using function names like create, read, update, destroy, delete, and so on (even though these functions were hooked into the WordPress API 
Models were functions also were called to validate and verify data prior to serializing the data. Again, this required that certain functions be hooked into WordPress to achieve the desired result. 

Por último, un conjunto de reglas de reescritura dieron la aplicación de un conjunto de direcciones URL limpia predecibles en el formato de/personas/actualización/o 1/personas/all. ¿Qué patrón implementa WordPress?

WordPress implementa la arquitectura controlada por eventos (de la que existen varias variaciones, como el Patrón de observador).

En resumen, se puede conceptualmente pensar en esto como el siguiente:

Things happen when WordPress is processing information. 
You can register your own function to fire when these things happen. 
No

demasiado complicado, ¿verdad? Un ejemplo de alto nivel de los patrones basados ​​en eventos enter image description here Un ejemplo de alto nivel de los patrones basados ​​en eventos

Cuando se empieza a pensar en términos de paradigma en el que funciona en lugar de tratar de hacer que funcione el forma en que quieres que funcione, es liberador. Ayuda a resolver problemas mucho más fácilmente.

La conclusión es la siguiente: WordPress implementa el patrón de diseño basado en eventos, por lo que incluso si termina por intentar implementar MVC, todavía tendrá que utilizar el sistema de enlace.

Si no tiene cuidado, puede terminar tratando de crear la arquitectura perfecta sin terminar su trabajo, y así terminar encontrándose tan arriba en la atmósfera del software que efectivamente se ha convertido en una arquitectura astronauta. ¿Así que está diciendo Evitar patrones de diseño?

¡Nada! Los patrones de diseño tienen un propósito porque, por encima de todo, básicamente nos dan soluciones a problemas resueltos previamente y comúnmente. ¡Usalos, usalos a ellos!

Pero el punto que estoy tratando de plantear es que no necesitamos intentar obligar a las cosas a ajustarse al patrón solo porque nos gusta el patrón. Ese no es su propósito. En su lugar, aproveche el patrón primario que implementa su plataforma de elección (en nuestro caso, es un patrón impulsado por eventos) y luego implemente patrones donde quepan (como la inyección de dependencia o algo así).

De lo contrario, es como tratar de poner el pie en un guante.

de guía (y totalmente copiado: P) de: http://tommcfarlin.com/wordpress-and-mvc/