插件架构/设计模式-对插件子类使用私有观察者/中介者模式还是使用WP ADD_ACTION更好?

时间:2011-04-16 作者:Gabriele B

我正在编写一个非常复杂的插件,它被组织为一个父“容器”类和几个子类,其中每个子类都是可选/必需的元素,通常(但不总是)映射到自己的add\\u子菜单页。

基本上,这是一个插件,带有他的私有集,我们称之为“子插件”。

每个子类/子插件都有自己的(大)一组add\\u操作和add\\u过滤器。所以,从技术上讲,我的插件的子插件是一个有效的WP插件,只是它不是由WP本身直接调用的。

自从我计划。。。实际上,大量的add\\u操作。。。我想知道我是否应该使用“私有”观察者/中介模式重构我的插件,即只将所有相关的add\\u操作收集到我的父类中,并烘焙一个模式来通知/转发事件的子类,从而减少插件对WP事件问题的影响。

这是个好主意还是完全没有必要?你能帮我编写一些类重构的代码吗?

提前通知tnx寻求帮助,加布里埃尔

3 个回复
最合适的回答,由SO网友:scribu 整理而成

我想知道我是否应该使用“私有”观察者/中介模式重构我的插件,即只将所有相关的add\\u操作收集到我的父类中,并烘焙一个模式来通知/转发事件的子类,从而减少插件对WP事件问题的影响。

事件队列是WP的基础,因此它非常快速getting faster 总是

因此,从性能角度来看,我认为创建自己的子队列没有任何意义。

重构代码,使您不必手动进行每个add\\u action()调用,这是另一回事。

SO网友:edelwater

所以我基本上采取了相同的方法,不知道是否正确。我想很多人都会采用这种方法,因为它是使用settings-api自然产生的。

我定义模块(=1个管理页、so标题等)每个模块都有插件(插件有字段,是从抽象插件类派生的一个对象。这里:http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-load-configuration.php

我认为这是由most自动完成的,因为例如模块:http://plugins.svn.wordpress.org/wp-favicons/trunk/includes/class-module.php 对应于我们需要为设置api执行的操作

init加载模块和插件(每个模块和插件都有自己的筛选器操作或附加到筛选器或操作){第三方可以将插件添加到模块}这里: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连接自身,例如:http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/sources/inc/class-module-sources-plugin.php 它对应于每个插件中始终存在的“do过滤器”,因此如果多个插件重复使用相同的“do”,则可以是进一步的抽象层。

并且可以在后端的类中附加到您自己的筛选器,例如。http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/request/request_cache.php在插件添加筛选器中添加特定筛选器

因此,从另一边“后端站点”我定义了自己的过滤器,每个插件都可以在其中连接自己,例如。http://plugins.svn.wordpress.org/wp-favicons/trunk/plugins/metadata_favicon/inc/class-favicon-factory.php 定义过滤器,如“Config::GetPluginSlug().“search”

所以一般来说。。。我认为设置API自然而然地促使我们采用这种方法。

所以然后,有些人(你的问题)会想到将自己的添加操作重新考虑到“其他”中,这些“其他”可以是观察者/中介模式或其他任何模式。

但是由于我们遵循WordPress的方法,使用设置API(如上所述),通过使用它,第三方可以轻松地“挂接”操作,编写自己的帮助页扩展等。。。我也会坚持使用add\\u操作,因为设计的“其余部分”也遵循这一点,这可能会使理解整个代码更加容易。

SO网友:kaiser

使用子插件分发插件的另一个很好的示例is this one.

结束

相关推荐

Pagination with custom loop

我的问题可能是Pagination not working with custom loop, 但有一种不同。我使用自定义循环来显示flash游戏。我想按类别在游戏页面上分页。类别php:<?php if ($cat) { $cols = 2; $rows = 4; $paged = ((\'paged\')) ? get_query_var(\'paged\') : 1; $post_per_page = $cols * $rows; // -1 s