插件体系结构/设计模式 - 更好地使用私人观察者/中介图案进行插件子类或WP add_action?
-
16-10-2019 - |
题
我正在编码一个非常复杂的插件,该插件被组织为父级“容器”类和几个子类,其中每个子类都是可选/强制性元素,通常(但并非总是)映射到他自己的add_submenu_page。
基本上,这是一个带有他的私人集合的插件,让我们称它们为“ Subplugins”。
每个子类/subplugin都有自己的(大)add_action和add_filter集。因此,从技术上讲,我的插件的Subplugin是一个有效的WP插件,只是WP本身直接调用它。
由于我计划了...实际上是大量的add_action ...我想知道我是否应该使用“私人”观察者/中介图案重构插件。收集所有相关的add_actions仅对我的父班,并烘烤图案以通知/转发事件的子类,从而减少了我的插件对WP事件问题的影响。
这是一个好主意还是绝对不必要?您能帮我一些班级重构的代码吗?
TNX提前寻求帮助,Gabriele
解决方案
我想知道是否应该使用“私人”观察者/中介图案重构插件。收集所有相关的add_actions仅对我的父班,并烘烤图案以通知/转发事件的子类,从而减少了我的插件对WP事件问题的影响。
活动队列对WP至关重要,因此非常快 变得更快 每时每刻。
因此,我认为制作自己的子标题是没有任何意义的。
重构代码,以便您不必将每个add_action()手动呼叫是另一回事。
其他提示
所以...我基本上采用了相同的方法,不知道它是否正确。我认为许多人都采用这种方法,因为它自然而然地从使用“设置API”中流出。
- 我定义模块(= 1个管理页面,因此标题等),每个模块都有插件(插件具有字段,是从抽象插件类派生的1个对象。
这里: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-load-configuration.php
我认为大多数人都会自动完成此操作,例如一个模块: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-module.php 对应于我们需要为设置API做的事情
- init加载模块和插件(每个插件都有自己的过滤器操作或附加到过滤器或操作){and第三方可以将插件添加到模块中}
这里: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-init.php
(如果插件在相应的管理页面上打开了插件是否应激活它们是否应激活)(可以表示为抽象: http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-plugin.php)
从抽象插件类派生的插件,然后或全部:设置额外字段,定义自己的管理员帮助屏幕,验证自己的字段,执行管理页面操作,执行客户端函数,例如过滤器
插件通过addFilter EG附加自身: http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/sources/inc/class-module-sources-plugin.php 它对应于每个插件中始终存在的“ do filter”,因此,如果多个插件重复使用相同的“ do”,则可以是另一个抽象层。
并且可以在后端的课程中附加到您自己的过滤器 http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/request/request/request_cache.php在插件ADD过滤器中添加特定过滤器
所以来自 另一边 “后端站点”我只是定义了自己的过滤器,每个插件都可以将自己连接到EG http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/metadata_favicon/inc/class-favicon-factory.php 定义过滤器,例如“ config :: getpluginslug()。'搜索'”
因此,总的来说...我认为设置API自然会驱使我们采取这种方法。
因此,...然后有些问题(您的问题),您会认为您将自己的附加操作重新输入“其他东西”,这可能是观察者/调解的模式或其他任何东西。
但是...由于我们使用设置API遵循WordPress方法(上面的整个内容),因此使用此功能使第三方可以轻松地“挂在”操作中,请写下自己的帮助页面扩展等...我会也可以在此处加上add_action,只是因为设计的其余部分也遵循了这一点,并且可以更容易理解整个代码。
另一个用于用子拼写插件分发插件的好示例 这是一个.