PHP-架构网站怎么做插件系统

UI设计界面 UI设计界面 主题:1059 回复:2190

PHP-架构网站怎么做插件系统

瑾兮 发布于 2017-04-30 字数 95 浏览 1078 回复 1

像discuz phpcms等网站都有很多插件
那么我们自己架构一个网站的时候 怎么设计插件系统?

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

支持 Markdown 语法,需要帮助?

评论(1

浮生未歇 2017-09-29 1 楼

先看一下对插件的描述:
插件:即当你需要它的时候激活它,不需要它的时候禁用/删除它;且无论是激活还是禁用都不影响系统核心模块的运行,也就是说插件是一种非侵入式的模块化设计,实现了核心程序与插件程序的松散耦合。
一个插件需要三个条件:
1、插件的支持函数,进行插件的功能实现
2、插件的Hook点,我们称为钩子埋入点,就是在什么地方这个插件要执行。
3、插件的位置

根据上面三个条件我们可以分三步:
第一步:支持函数:
我们新建函数文件function.php,代码如下:

?php
/*

  • 在插件列表中要添加的插件名
  • @ pragma string $hook 插件列表名
  • @ pragma string $actionFunc 插件名
    */
    function addAction($hook, $actionFunc){
    global $emHooks;
    if (!@in_array($actionFunc, $emHooks[$hook])){
    $emHooks[$hook][] = $actionFunc;
    }
    return true;
    }
    /**
  • 插件钩子的执行函数。也就是所谓的钩子的埋入点函数
  • @param string $hook 插件列表名
    */
    function doAction($hook){
    global $emHooks;
    $args = array_slice(func_get_args(), 1);//获取其他参数
    if (isset($emHooks[$hook])){
    foreach ($emHooks[$hook] as $function){
    $string = call_user_func_array($function, $args);
    }
    }
    }

第二步:设置钩子埋入点:

define("APP_ROOT",str_replace("\","/",dirname(FILE))."/");
require("function.php"); //加载功能函数
/**

  • 加载插件路径
  • 一般情况下,我们要先存储和判断插件是否激活,
    你可以保存在数据库中,也可以保存在文件配置缓存中
    /
    function load_plugins_file($plugin) {
    //要判断和检查。
    if(is_string($plugin) && preg_match("/^[w-/]+$/", $plugin) && file_exists(APP_ROOT."plugins/".$plugin.".php")){
    require APP_ROOT."plugins/".$plugin.".php";
    }
    }
    //演示的插件例子
    $pluginsName = array("check_all","login");
    foreach($pluginsName as $plugin){
    load_plugins_file($plugin);
    }
    //埋下的钩子
    doAction("fbbin");

第三步:插件代码实现
我们按照上面定义的两个插件名字建立check_all.php和login.php两个文件,然后在check_all.php文件中写入:

 <?php
function check_all() {
echo "<p>全部通过</p>";
}
addAction("fbbin","check_all");//像fbbin插件列表中添加插件,那么之后执行的doAction函数就能在全局变量中找到这个插件了,那么这样子,这个插件便会被执行。
?>

以上内容均来自网络,另外网上有个比较正规的例子:
PHP中插件机制的一种实现方案