问题描述

有些人认为 WordPress 是一个博客平台,有人将其视为 CMS,有人将 WordPress 视为开发框架。无论哪一个,问题仍然存在。是否符合 WordPress MVC?

三年前我已经看过论坛,有人问过 MVC 。有一些积极的答案,一些负面的答案。虽然没有人知道 MVC 是什么,每个人都以自己的方式认为,但仍然存在所有讨论中的一般概念。

我对 MVC 框架没有什么经验,而且框架本身似乎没有什么。大多数 MVC 是由程序员完成的,我是对的吗?现在回到 WordPress,我们可以考虑控制器的核心重写引擎 (WP_Rewrite) 吗?查询& 插件逻辑作为模型?和主题作为观点?还是我错了?

谢谢 😉

最佳解决方案

WordPress 本身不是在 MVC 中架构的,而是可以在框架内构建非常面向 MVC 的主题和插件。有几个工具可以帮助:

WordPress MVC 解决方案:

WordPress.org 上的 MVC 主题想法和 Trac:

次佳解决方案

WordPress 是 kinda-sorta MVC 。如果有什么是 pull-type MVC 布局,那么来自模型的查看’pulls’ 数据。它以非常先进的方式进行,而不是使用大量不同的对象,但这实际上使得前端模板更容易以很多方式编写。

这也给出了一些程度的控制器逻辑 (因此是 kinda-sorta MVC) 。

让它运行下来:Wordpress 获取一个 URL 。 wordpress 核心充当控制器,并确定哪些初始查询运行数据库,并通过扩展,应加载什么视图 (类别视图,单个页面或页面视图等) 。然后打包 INTIAL 查询响应并将其发送到视图文件。

该视图文件可以是严格的仅显示文件,或者可以请求超出内置的其他信息/查询。这是 MVC 的 pull-type,其中的视图从模型中提取数据,而不是从模型中将控制器’pushing’ 数据拉入视图。

因此,当视图看到加载边栏或窗口小工具区域的代码时,它会询问该信息。但是,什么小工具应该在那里由控制器确定,它查看侧边栏中的小工具的模型,然后选择设置为在当前页面上显示的部件,并将其返回到视图。

它的每一部分都不是一个对象,并不能使 MVC 更少。你可以改变 WP 核心,而不用 (一定) 改变任何关于主题的东西。同样,只要使用像’get_pages()’ 这样的内置函数,只要这些函数仍然返回正确的数据,模型和数据库表就会发生变化。因此,该模型独立于视图,并且控制器也是独立的 (除了当视图添加控制器逻辑以做比核心通常更多) 时。

虽然你可以有一个模型对象持有许多方法和东西,如 WPModel :: get_pages(‘blah blah’),并包含所有这一切,仍然存在着根本的分离问题。

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

只要姓名,论据等保持一致 (或者只是添加新的名称),那么保持关切的分离,可以在不打扰别人的情况下进行改变。

它不是 MVC 的 super-clean 版本 (特别是在钩子涉及的时候),但是从基础开始它就开始了。

而且正在进行中,这不是一件坏事 IMO 。来自网站的请求本质上是一个循序渐进的过程:一个清晰的开始和结束的过程,只需要一个处理请求,获取数据,打包,然后死机的过程。您可以使用对象和对象方法和 OOP 布局来设置这些步骤 (这将使一些事情变得更容易),或者您可以编写大量的函数调用并将它们分开。类成员像私有变量这样丢失,但根据应用程序的需要… 你可能不在乎。

没有 one-grand-way 来开发,而 WP 就像 20%的网站一样,所以它正在做正确的事情。可能与不要让人们学习/记住复杂的类层次结构以使数据库能够回答 「什么页面是页面 x 的孩子」 的问题有关。并处理该数据。你能用 OOP 这么容易吗?是的,但是如果 Joomla 是使用 OOP 来实现复杂的自定义网站的难点,那么 WP 更容易和快捷,时间就是金钱。

第三种解决方案

如在评论中已经提到的,MVC 是一种建筑设计模式,而不是一个特定的框架,而不是,Wordpress 不遵循 MVC 模式。

有一个从编程逻辑中分离的视图 (模板),但是只有在前端,而不是在管理面板中,一般分离视图和应用程序逻辑不是不可避免的 MVC 。 MVC 模式的实现通常假定某种面向对象的编程范式,Wordpress 主要以程序方式实现,在 PHP 函数中使用纯 SQL 查询,因此也没有实际的模型。

第四种方案

只是为了更新这个更新的信息,人们从搜索引擎中击中这个 – wp-mvc 插件 http://wordpress.org/extend/plugins/wp-mvc/在创建一个 mvc 框架的插件开发方面有很长的路要走。你可以在这里找到更多:http://wpmvc.org/documentation/70/tutorial/

第五种方案

只是添加到选项列表 (我承认有偏见的作者,)swpMVC 是一个功能齐全,轻量级的 MVC 框架,灵感来自 Rails,Sinatra,Express 和 FuelPHP 。这是完全记录的,当我使用和喜欢 wp-mvc 时,我想要一些模型能够自己填充意见的东西,包括与所述模型交互的表单控件。

我把它放在一起大部分是为了减少控制器代码所需的数量,将一个应用程序放在 WordPress 之上,结果是在 WordPress 中运行的非常快速和有效的框架。这些模型基于 PHP Activerecord,现有 WordPress 数据类型包括 8 个模型,包括 Post,PostMeta,User,UserMeta,Term 等等。由于 activerecord 库,建模数据非常简单,而且我非常喜欢这个框架。

还附带下划线 PHP 和 PHP Quick Profiler(如 FuelPHP 所示) 。

第六种方案

与 WordPress 有关的定期讨论的主题之一是 WordPress 和 MVC 的想法。

但事实是,MVC 并不是网络开发的一个子弹,我们试图使它成为。是的,这是一个令人敬畏的设计模式,我个人认为它适合 Web 应用程序模型,如手套,但并不是每个框架或平台都实现了这种设计模式。

例如:WordPress 不是 MVC 。

没关系我想我们需要放弃尝试将它们插入我们的项目,特别是当 WordPress 提供的模式不仅足够,而且在正确利用时效果很好。

「但我爱 MVC!」

我也是!事实上,我去年在 more-or-less 模拟 MVC 架构的项目上工作。 MVC 的一个 high-level 例子。

MVC 的一个 high-level 例子。

例如:

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 实现什么模式?

WordPress 实现了 event-driven 架构 (其中有几种变化,如 Observer 模式) 。

简而言之,你可以从概念上考虑这一点:

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

不是太复杂了吗? high-level event-driven 图案的例子 high-level event-driven 图案的例子

当你开始思考其工作原理的方式,而不是试图让它工作的方式,你想要它的工作,它的解放。它有助于更​​容易地解决问题。

底线是这样的:WordPress 实现了 event-driven 设计模式,所以即使你最终试图实现 MVC,你仍然需要利用挂钩系统。

如果你不小心,你可以最终尝试制作完美的建筑,而不用完成你的工作,因此最终会发现自己在软件的气氛中如此高效,你已经有效地成为了宇航员。所以你说避免设计模式?

一点也不!设计模式有一个目的,因为首先,他们基本上为我们解决了以前和常见的解决问题的解决方案。使用它们!

但是我想要做的是,我们不需要试图强迫事情适合模式,只因为我们喜欢模式。这不是他们的目的。相反,利用您选择的平台实现的主要模式 – 在我们的例子中,它是一个 event-driven 模式,然后实现它们适合的模式 (如依赖注入或类似的东西) 。

否则,就像试图把你的脚放在手套里。

礼貌 (并完全复制:P) 从:http://tommcfarlin.com/wordpress-and-mvc/

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。