首先,做起来并不容易,随着开发的进行,也更难坚持。
我将尝试先回答您的要点,然后尝试谈谈我尝试遵守的一些架构方面的内容。
- 我将它们组织得尽可能接近正常。所以我通常会得到模型、控制器、视图的文件夹。尝试以与其他任何事情相同的方式尽可能多地编写您的应用程序。
- 使用
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 内容。
如果您还有其他问题,请告诉我。