我正在工作一个wordpress插件,它占用整个页面,并计划一次旅行。
插件扩展并包含多个模块和超过10个“视图”(预订,计费,注册,我的个人资料,我的预订,我的评论,等等)。
我有一个强大的OOP和MVC背景,但是这个插件最初是在一个模板上创建的,每个模板都加载了ajax,而不是以一种有组织的方式:)
Bounty:我在这里寻找有经验的人的指导方针。
发布于 2014-01-08 16:10:39
首先,要做到这一点并不容易,而且随着发展的进展,坚持下去也更难了。
我将试着先回答你的要点,然后再试着谈一些我试图坚持的架构问题。
plugin_url()。如果您正在从事一个不会被分发的项目(即不是一个公开发布的插件),您就有了一些优势,因为您可以从Composer加载外部包,而不必担心来自其他地方的冲突。所以只要有可能,我建议把东西卸给作曲家。
我不喜欢PHP如何实现名称空间,但我非常喜欢将它们与自动加载结合使用。如果您使用某种形式的奥托罗定,即使它不与名称空间一起使用,也肯定会使您自己变得更容易。
由于WordPress使用的是函数钩子,除非你(结束了?)设计了很多东西,否则你总是会有一大堆钩子到处都是。通常,我的建议是尝试将它们放在一个文件中,并且不要将钩子放在类中,特别是构造函数中。把东西按逻辑分组。
真正的诀窍是尽量减少实际与WordPress交互的点的数量,以及其他任何地方都可以按照通常的方式编写代码,使用体面的设计模式等等。您必须有某些接触点(比如钩子之类的),您可能会发现自己对WordPress做出了一些让步,但即使在那里,您也可以通过将对象方法作为钩子回调加载,并将这些方法用作“正常”应用程序的起始点来减轻它的影响。
我对这个问题有一段时间感兴趣了。我在这方面有几个正在进行的项目。我把它放在一起的一件事是为了与GravityForms接口,它在github上。这并不复杂,但它可能有助于解释我是如何解决这个问题的。
我已经没有更多的细节需要补充了,但是如果你愿意的话,请随便给我留句话。正如我所说的,我真的很有兴趣解决这个问题,我认为如果WordPress持续并且继续像今天一样流行,我们将会有更好的解决方案。
我希望这是有帮助的!
编辑:-一个更具体的例子
我将在我最初共享的代码中指出一些内容。它有点专门化,但您可以将这些原则用于任何基于钩子的功能。正如您所看到的这里,我正在调用类GravityFormsHooks\Loader的方法来处理与对象的挂钩。在GravityFormsHooks\Loader中,我调用该类上的另一个静态方法来实际执行钩子。这个例子将采取行动或过滤器,但它是专门针对Gravityform的,所以YMMV。
本质上,这个GravityFormsHooks\Loader::hook()方法所做的就是实例化我们要链接到的类,并正常地生成钩子。
我从主插件文件中调用的类是GravityFormsHooks\Forms\Form。请注意,您挂接的任何方法都必须声明为public。如果我们要将自己发展成MVC模式,这里的方法将是您的控制器。从那里,你可以跳到注入模型,模板引擎,所有方式的酷东西。
正如我在最初的文章中提到的,我试图将我与WordPress的联系点保持在一个绝对的最低限度。我的意思不是说您应该编写WordPress已经有API的API,只是您的钩子应该是集中的和最小化的。它确实是一种有用的关注点分离,随着应用程序的增长,它将帮助您更容易地管理复杂性。
我提供的示例应该像Hook控制器一样工作得很好,只要进行最小的修改,就可以删除一些更专业的GravityForms内容。
如果你还有其他问题,请告诉我。
https://stackoverflow.com/questions/20899969
复制相似问题