我确实有一个插件管理工具,但我只将它与主要的程序插件一起使用,并且所有包含的内容通常会立即加载。但对于基于事件和延迟加载的 API,我可以想象使用浅层包装器进行插件管理,并采用自动加载来实现实际扩展。
<?php
/**
* api: whatever
* version: 0.1
* title: plugin example
* description: ...
* config: <var name="cfg[pretty]" type="boolean" ...>
* depends: otherplugin
*/
$plugins["title_event"] = "TitleEventClass";
$plugins["secondary"] = array("Class2", "callback");
?>
在此示例中,我假设插件 API 是一个简单的列表。这个例子feature-plugin-123.php
脚本除了在加载时添加到数组之外什么也不做。所以即使你有十几个功能插件,也只会产生额外的费用include_once
each.
但是主应用程序/或插件 API 可以只实例化提到的类(或者new $eventcb;
对于原始类名或call_user_func_array
用于回调)。反过来,它将实际任务卸载到自动加载器。因此,您拥有一个双系统,其中一部分管理列表,另一部分定位真正的代码。
因此我仍然想象一个简单的config.php
它只列出插件和设置,如下所示:
<?php
include_once("user/feature-plugin-123.php");
include_once("user/otherplugin2.php");
include_once("user/wrapper-for-htmlpurifier.php");
$cfg["pretty"] = 1;
再次记住,这些只是包装器/数据脚本,带有可管理性的插件描述。人们也可以使用实际的register_even()
API 并在每个中定义一个附加的包装函数。但列出类名似乎是最简单的选择。
前面提到的管理工具有点生锈而且丑陋:http://milki.include-once.org/genericplugins/ http://milki.include-once.org/genericplugins/
但如果你只需要一个列表(sql表)而不需要设置管理,那么它是不需要的。该开销仅用于漂亮打印插件元数据并保持人类可读config.php
.
综上所述:
spl_autoload()
在 include_path 上,以及一个简单的事件->类名注册表,每个包装脚本一个,只需一次包含所有内容。