我正在制作一个wordpress插件,它占据了整个页面,并且是关于计划旅行的。
该插件展开并包含多个模块和超过10个“视图”(预订,结算,注册,我的个人资料,我的预订,我的评论等)。
我有一个强大的OOP和MVC背景,但这个插件最初是在一个模板上创建的,所有内容都加载了ajax而不是有条理的方式:)
恩惠: 我正在寻找有经验的人的指导。
答案 0 :(得分:7)
首先,这并不容易,随着开发的进展,它更难坚持。
我会首先尝试回答你的要点,然后尝试谈谈我试图坚持的一些架构内容。
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控制器工作得很好,只需要进行最少的修改就可以删除一些更专业的GravityForms内容。
如果您有任何其他问题,请告诉我。