WordPress符合MVC架构吗?

63

有些人认为WordPress是一个博客平台,有些人把它称为CMS,还有一些人将WordPress称为开发框架。不管怎样,问题仍然存在。WordPress是否符合MVC标准?

我阅读了论坛,大约三年前就有人提出了MVC的问题。有些人持肯定态度,有些人持否定态度。虽然没有人确切知道MVC是什么,每个人都有自己的看法,但在所有讨论中都存在一个普遍的概念。

我对MVC框架的经验很少,而且似乎与框架本身无关。大多数MVC是由程序员完成的,我是对的吗?现在,回到WordPress上,我们能否认为核心重写引擎(WP_Rewrite)是控制器?查询和插件逻辑作为模型?主题作为视图?还是我完全错了?

谢谢 ;)


1
MVC是一种架构设计模式,与软件类型无关。任何博客平台、CMS或开发框架都可以采用MVC,取决于其架构如何设计。 - eKek0
eKek0,我就知道。但嘿,应该有一些 CMS 和框架的例子不符合 MVC,即它们的核心架构根本不是 MVC。你能想到吗? - kovshenin
9个回答

46
WordPress本身并不是MVC架构的,但是在框架内可以构建非常MVC导向的主题和插件。有几个工具可以帮助实现:
WordPress MVC解决方案:
- Churro: @ wordpress.org/extend/plugins/churro - Tina-MVC: @ wordpress.org/extend/plugins/tina-mvc - Plugin Factory: @ wordpress.org/extend/plugins/plugin-factory - MVCPress: http://mozey.wordpress.com/2007/01/22/mvcpress-screenshots/#comment-3634 (已废弃,但有趣的想法)
WordPress.org Ideas和Trac上的MVC主题:
- http://wordpress.org/extend/ideas/topic/mvc-plugin-framework - http://wordpress.org/extend/ideas/topic/complete-reestructuring - http://wordpress.org/extend/ideas/topic/rewrite-wordpress-using-mvc - http://wordpress.org/extend/ideas/topic/wordpress-theme-revamp (更多关于XSL而非MVC) - http://core.trac.wordpress.org/ticket/12354 (关于小部件中的MVC)

1
MVC的理念似乎非常不受欢迎 - 几乎所有人都投票反对到死。 - Hexodus

24

WordPress有点像MVC架构。它采用了一种拉取式的MVC布局,其中视图从模型“拉取”数据。这种方式是通过过程化的方式实现的,而不是使用许多不同的对象,但这实际上使得前端模板在许多方面更容易编写。

这也赋予了视图某种程度的控制器逻辑(因此是“有点像”MVC)。

让我们来看看:

WordPress获取URL。WordPress核心充当控制器,确定要运行数据库的初始查询,以及由此引申出的要加载的视图(类别视图、单个帖子或页面视图等)。然后,它将打包初始查询响应并发送到视图文件。

该视图文件可以是严格的只显示文件,也可以请求超出内置文件的其他信息/查询。这就是MVC的“拉取式”,其中视图从模型中提取数据,而不是控制器从模型中“推送”数据到视图中。

因此,当视图看到加载侧边栏或小部件区域的代码时,它会请求该信息。然而,哪些小部件应该在那里由控制器决定,控制器查看侧边栏中的小部件,并选择设置为在当前页面显示的小部件,然后将这些返回给视图。

虽然每个部分都不是对象,但这并不会使其MVC变得不重要。您可以更改WP核心而不必(必须)更改主题的任何内容。同样,只要使用内置函数如“get_pages()”,那么模型和数据库表格可以更改,只要这些函数仍然返回正确的数据即可。因此,模型独立于视图,控制器也是独立的(除非视图添加控制器逻辑以执行比核心通常完成的更多操作)。

虽然您可以使用一个包含许多方法和类似WPModel :: get_pages('blah blah')的模型对象来包含所有内容,但仍存在基本的关注点分离。

视图:模板文件 控制器:WP核心 模型:处理特定数据的各种功能。

只要名称、参数等保持不变(或只添加新的)则可维护关注点分离,这样更改一个内容时就不会干扰其他内容。这不是 MVC 的超级干净版本(特别是涉及钩子时),但从基本层面上看它始于此。在我看来,以过程为中心并不是什么坏事。网站的请求本质上是过程性的:它是有明确开端和结束的过程,只需处理请求、获取数据、打包数据,然后关闭即可。您可以使用对象和对象方法以及 OOP 布局设置这些步骤(这将使某些内容更容易),或者您可以编写许多函数调用并通过这种方式将它们分开。但这种方式会丢失类成员,例如私有变量。但根据应用程序的需求,您可能并不在意。开发没有一个万能的方法,WP 占据着约 20% 的网站份额,因此它做得很好。可能是因为 WP 不会让人们学习/记忆复杂的类层次结构来回答“哪些页面是页面 x 的子页面?”并处理这些数据。使用 OOP 可以使这一切变得如此简单吗?是的,但如果 Joomla 是实现具有复杂定制网站的难度的任何例子,那么 WP 的难度要小得多,且速度更快,而时间就是金钱。

我在评论自己的写作。WordPress本身并不是MVC。实际上,它默认采用的设计模式根本不是MVC。通常,我使用视图文件(如page.php)作为控制器类型的脚本(准备变量、业务逻辑等,并在必要时与数据库交互),然后加载一个单独的视图文件,例如page-view.php。我一直以这种方式做了一段时间,直到我看到那些过于复杂的代码,才意识到正常的WP代码有多么复杂。 - Brenn

9
如评论中所述,MVC是一种架构设计模式,而不是特定的框架,不,Wordpress没有遵循MVC模式。
在前端中存在视图(模板)与编程逻辑的分离,但在管理面板中不存在,而且视图和应用逻辑的一般分离并不一定是MVC。实现MVC模式通常假定其背后有某种面向对象的编程范例,而Wordpress主要以过程化方式实现,使用PHP函数中的纯SQL查询,因此也没有实际的模型。

6

WordPress和MVC的关系是WordPress讨论中经常涉及的话题之一。

但事实是,MVC并不是我们试图让它成为的Web开发的万能钥匙。是的,它是一个很棒的设计模式,我个人认为它非常适合Web应用程序模型,但并非每个框架或平台都实现了这种设计模式。

事实上,WordPress就不是MVC。

这没关系。我认为我们需要把尝试将其强行融入我们的项目的愿望放在一边,特别是当WordPress提供的模式既足够,而且正确使用时效果良好。

“但我喜欢MVC!”

我也是!事实上,我花了去年的时间研究了一个几乎模仿了MVC架构的项目。

下面是MVC的高级示例图:

enter image description here

例如:

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.

最后,一组重写规则使应用程序具有可预测的干净URL格式,例如/people/update/1或/people/all。

WordPress实现了事件驱动架构(其中有几个变体,如观察者模式)。

简而言之,您可以将其概念化为以下内容:

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

不是太复杂,对吧? 事件驱动模式的高级示例 enter image description here 一个高级的事件驱动模式示例
当你开始按照它的范例去思考而不是试图让它按照你想要的方式工作时,它是解放的。它有助于更轻松地解决问题。
底线是:WordPress实现了事件驱动设计模式,因此即使您最终尝试实现MVC,仍然需要使用钩子系统。
如果你不小心,你可能会试图打造完美的架构,但实际上没有完成你的工作,因此你会发现自己在软件大气层中如此之高,以至于你有效地成为了一名宇航员。
那么你是在说避免设计模式吗?
并非如此! 设计模式具有目的,因为它们基本上为我们提供了先前和常见问题的解决方案。 使用它们!
但我想说的是,我们不需要试图强制事物符合模式,只因为我们喜欢这个模式。 这不是它们的目的。 相反,利用您所选择的平台实施的主要模式 - 在我们的情况下,它是事件驱动模式 - 然后在适当的位置实施模式(例如依赖注入或类似的内容)。
否则,这就像试图将脚放进手套里。
友情提醒(完全复制:P)来自:http://tommcfarlin.com/wordpress-and-mvc/

5

1
看起来不错,但是最新的代码更新已经有两年了。这个项目还在继续吗? - Hexodus

4

除了上述选项外,(我承认有偏见,因为我是作者之一,)swpMVC是一个完整的轻量级MVC框架,受到Rails、Sinatra、Express和FuelPHP的启发。它有详细的文档,虽然我已经使用过并喜欢wp-mvc,但我想要一些东西,其中模型能够自行填充视图,包括用于与这些模型进行交互的表单控件。

我主要编写了这个框架,以减少在WordPress之上构建应用程序所需的控制器代码量,其结果是一个非常快速和有效的框架,可在WordPress内部运行。模型基于PHP Activerecord,并包括8个现有WordPress数据类型的模型,包括文章、文章元数据、用户、用户元数据、术语等。由于activerecord库,建立数据模型非常容易,迄今为止,我非常喜欢使用这个框架。

还附带有underscore PHP和PHP Quick Profiler(如FuelPHP所示)。


1
哇,Brian干得好!这个框架非常酷,我会尝试一下的。 - Hexodus

2

RokkoMVC是一个专为WordPress打造的微型MVC框架。该项目旨在简化WordPress应用中的AJAX功能,并将使用模型、视图和控制器带来的所有其他好处引入到您的主题中。


1
最近我尝试创建了一个插件,使用了简单的视图控制器系统,并且很喜欢结果,所以我将模板部分分离出来到自己的存储库。它提供了基于对象的控制器,本地传递变量到PHP模板,模板片段(模板内的模板)和组件(具有自己子控制器的模板片段)。所有这些只用了两个小类!
当然,我写这段代码时认为没有其他WP开发人员考虑过这个问题;-)

0

离MVC差得远,没有所谓的“有点像但又不完全是”的东西,要么是MVC,要么不是... 在视图层级上编写逻辑并不能称之为一个MVC框架。人们使用它的原因在于,它容易学习,不需要成为一名专业的PHP程序员,他们懒得费劲。


1
WordPress远非“易于学习”,要正确使用它需要一定的技术水平,而我认为这是因为它没有采用MVC模式。它是多种技术和设计模式的混合体,这些技术和设计模式是多年来引入的,遗留兼容性阻碍了任何重大改进。代码库可能是一个难以处理的雷区,“懒惰”的人会遇到许多问题,就像他们在任何框架中一样。 - Jason
相比Zend或其他像CI这样的适当框架,它很容易学习...甚至命名约定也有很大的改进空间。来吧!! - lokers
1
你说得对 - WP不是MVC。我刚开始使用WP,第一次浏览一个非常著名的主题的模板文件时,我感到很害怕 - 这看起来像10年前人们使用的编码风格 - HTML、PHP、CSS混在一起。业务逻辑和屏幕表示在同一个地方。别误会 - WP非常好,但我认为它需要重写。 - Hexodus
@Hexodus,看看数据库,你会更加惊讶 :) - lokers
你不必在视图层编写逻辑。但这种方法确实鼓励这样做。如果你将普通的视图文件(如post/page.php)作为更多的业务控制器,而不是在处理所有业务逻辑后加载不同的视图文件,那么代码会变得更加清晰。这正是我一直在做的事情。 - Brenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接