【问题标题】:wordpress plugin MVC page structurewordpress插件MVC页面结构
【发布时间】:2014-01-13 05:25:43
【问题描述】:

我正在开发一个 wordpress 插件,它可以占据整个页面并计划一次旅行。

该插件展开并包含多个模块和 10 多个“视图”(预订、计费、注册、我的个人资料、我的预订、我的 cmets 等)。

我有很强的 OOP 和 MVC 背景,但是这个插件最初是在一个模板上创建的,所有的东西都是用 ajax 加载的,而不是以有组织的方式 :)

  • 在 wordpress 中组织大型插件(半小型网站)的最佳做法是什么?
  • 有没有办法为模块视图文件创建直接链接?就像是: domain.com/blog/wp/plugins/my_plugin/profile.php

赏金: 我在这里从有经验的人那里寻找指导方针。

【问题讨论】:

  • wordpress(实现“大泥球”架构模式)插件与 MVC 应用程序架构相关的具体情况如何?
  • 我不喜欢在“大泥球”架构中工作,但我的任务是构建一个大型 wordpress 插件,所以我正在寻找有关如何制作它的指南/经验丰富的 Appenion更少泥泞,更有条理。

标签: model-view-controller wordpress


【解决方案1】:

首先,做起来并不容易,随着开发的进行,也更难坚持。

我将尝试先回答您的要点,然后尝试谈谈我尝试遵守的一些架构方面的内容。

  • 我将它们组织得尽可能接近正常。所以我通常会得到模型、控制器、视图的文件夹。尝试以与其他任何事情相同的方式尽可能多地编写您的应用程序。
  • 使用plugin_url()

如果您正在处理一个不会分发的项目(即不是公开发布的插件),那么您将获得一些优势,因为您可以从 Composer 加载外部包,而不必担心来自其他地方的冲突。因此,只要有可能,我建议将内容卸载到 Composer。

我不喜欢 PHP 如何实现命名空间,但我非常喜欢将它们与自动加载结合使用。如果你使用某种形式的Autoloading,你肯定会让事情变得更轻松,即使它没有与命名空间一起使用。

由于 WordPress 使用功能挂钩,除非您(过度?)设计了很多东西,否则您总是会在整个地方遇到一堆挂钩。一般来说,我的建议是尝试将它们放在一个文件中,并且永远不要将钩子放在类中,尤其是构造函数中。将内容按逻辑分组。

真正的诀窍是最大限度地减少您实际与 WordPress 交互的点数,以及在其他任何地方基本上像往常一样编写代码,使用体面的设计模式等。您必须有某些联系点(如钩子等),您可能会发现自己对 WordPress 做出了一些让步,但即使在那里,您也可以通过将对象方法加载为钩子回调并将其用作跳跃来缓解它-off 指向“正常”应用程序。

我对这个问题感兴趣已经有一段时间了。我在这个领域有几个正在进行的项目。我拼凑的一件事是与 GravityForms 交互,它位于 github。这真的不复杂,但它可能有助于解释我如何解决这个问题。

我没有什么要补充的细节了,但如果您愿意,请随时给我留言。正如我所说,我对解决这个问题真的很感兴趣,而且我认为如果 WordPress 持续存在并继续像今天一样流行,我们将会有更好的解决方案出现。

希望对你有帮助!

编辑:一个更具体的例子

我将在我最初共享的代码中指出一些内容。它有点专业,但您可以将这些原则用于任何基于钩子的功能。如您所见here,我正在调用GravityFormsHooks\Loader 类的方法来处理挂钩到对象。在GravityFormsHooks\Loader 中,我调用another static method on that class 来实际执行钩子。此示例将采取行动或过滤器,但它是专门为 Gravityforms 量身定制的,因此 YMMV。

这个GravityFormsHooks\Loader::hook() 方法所做的基本上是实例化我们要挂钩的类,并正常生成挂钩。

我从主插件文件调用的类是GravityFormsHooks\Forms\Form。请注意,您挂钩的任何方法都必须声明为public。如果我们要将自己硬塞进一个 MVC 范式中,这里的这个方法就是你的控制器。从那里,您可以开始注入模型、模板引擎,以及各种很酷的东西。

正如我在原帖中提到的,我尽量将与 WordPress 的联系点保持在最低限度。我并不是说你应该编写 API 来做 WordPress 已经有 API 的东西,只是你的钩子应该集中并最小化。这确实是一种有用的关注点分离,随着应用程序的增长,它将帮助您更轻松地管理复杂性。

我提供的示例应该可以很好地用作 Hook Controller,只需进行最少的修改即可删除一些更专业的 GravityForms 内容。

如果您还有其他问题,请告诉我。

【讨论】:

  • 我喜欢你插件的结构,但它没有 composer.json。你怎么包括树枝?
  • 它应该有一个composer.json。不久前我将它推送到 github 以向某人展示它,并且从未添加它需要工作的其余内容。 :-/
  • 感谢您的详细回答。我认为主要的里程碑是创建一个好的基本模板(前端控制器?),正如您所说,将 wordpress 钩子和关系与您的 OOP 代码分开。你有这方面的例子吗?
  • 我使用我之前分享的插件更新了我的答案,并进行了更详细的演练。
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多