插件机制的实现核心类

转载 2016年10月14日 09:36:02
<?php
/**
*
* 插件机制的实现核心类
*/
class PluginManager
{
    /**
     * 监听已注册的插件
     *
     * @access private
     * @var array
     */
    private $_listeners = array();
     /**
     * 构造函数
     *
     * @access public
     * @return void
     */
    public function __construct()
    {
        #这里$plugin数组包含我们获取已经由用户激活的插件信息
     #为演示方便,我们假定$plugin中至少包含
     #$plugin = array(
        #    'name' => '插件名称',
        #    'directory'=>'插件安装目录'
        #);
        $plugins = get_active_plugins();#这个函数请自行实现
        if($plugins)
        {
            foreach($plugins as $plugin)
            {//假定每个插件文件夹中包含一个actions.php文件,它是插件的具体实现
                if (@file_exists(STPATH .'plugins/'.$plugin['directory'].'/actions.php'))
                {
                    include_once(STPATH .'plugins/'.$plugin['directory'].'/actions.php');
                    $class = $plugin['name'].'_actions';
                    if (class_exists($class))
                    {
                        //初始化所有插件
                        new $class($this);
                    }
                }
            }
        }
        #此处做些日志记录方面的东西
    }


    /**
     * 注册需要监听的插件方法(钩子)
     *
     * @param string $hook
     * @param object $reference
     * @param string $method
     */
    function register($hook, &$reference, $method)
    {
        //获取插件要实现的方法
        $key = get_class($reference).'->'.$method;
        //将插件的引用连同方法push进监听数组中
        $this->_listeners[$hook][$key] = array(&$reference, $method);
        #此处做些日志记录方面的东西
    }
    /**
     * 触发一个钩子
     *
     * @param string $hook 钩子的名称
     * @param mixed $data 钩子的入参
     *    @return mixed
     */
    function trigger($hook, $data='')
    {
        $result = '';
        //查看要实现的钩子,是否在监听数组之中
        if (isset($this->_listeners[$hook]) && is_array($this->_listeners[$hook]) && count($this->_listeners[$hook]) > 0)
        {
            // 循环调用开始
            foreach ($this->_listeners[$hook] as $listener)
            {
                // 取出插件对象的引用和方法
                $class =& $listener[0];
                $method = $listener[1];
                if(method_exists($class,$method))
                {
                    // 动态调用插件的方法
                    $result .= $class->$method($data);
                }
            }
        }
        #此处做些日志记录方面的东西
        return $result;
    }
}

相关文章推荐

Qt键盘驱动处理类的实现:Qt键盘驱动处理类的实现,通过Qt的插件机制实现嵌入式开发中的自定义键盘处理。

//键盘插件的实现 //MyKeyDriverPlugin.h文件 class MyKeyDriverPlugin : public QKbdDriverPlugin { Q_OBJEC...

php插件机制开发模式实现方法!

  • 2012年10月05日 16:41
  • 36KB
  • 下载

CLI子命令扩展-插件机制实现

开发CLI工具过程中,为了便于扩展,将CLI的实现分为基础功能和扩展功能。基础功能包括init、build、lint、publish等伴随工程从初始化到最终发布到生产环境,也即为CLI 的core。扩...

SHOPNC 插件机制的实现记录

/global.php 添加:        defined('DIR_PLUGINS') ||define('DIR_PLUGINS',BASE_ROOT_PATH.'/plugins');//ad...
  • fupozsl
  • fupozsl
  • 2016年05月25日 19:37
  • 1173

使用assets目录来实现插件机制

/** * 管理接口。 * @author jevan * @version 1.0 at 2013-12-6 * */ public interface IManage { /**...
  • enlangs
  • enlangs
  • 2013年12月12日 12:08
  • 490

Qt5的插件机制(2)--QxxxFactory类与QFactoryLoader类

在Qt的插件加载机制的概述中,我已经提到过,一个QFactory 类往往对应于某一类别、或某种特定功能的插件。 在Qt中,为了区分不同类别、不同功能的插件,应该为每一类插件设置一个独特的 IID 值,...

C++插件机制的一种实现方法(对象工厂)

背景 在我们的实际开发过程中,经常会开发一些插件,比较常见的例子如:给你 DataHandler,它是一个抽象类,提供一些数据操作的接口,然后插件开发者就需要继承DataHandler,并按需求...

WordPress插件机制实现原理

1)WordPress读取所有可用的插件 在文件”/wp-admin/includes/plugin.php”中,函数 get_plugins() 用来从文件系统得到所有的插件。原理很简单,就是...

WordPress插件机制实现原理

1)WordPress读取所有可用的插件 在文件”/wp-admin/includes/plugin.php”中,函数 get_plugins() 用来从文件系统得到所有的插件。原理很简单,就是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:插件机制的实现核心类
举报原因:
原因补充:

(最多只允许输入30个字)