简单的插件钩子系统

网站技术 ayflying 2920℃ 评论

下面有注释了,直接贴代码吧

/**
 * 插件钩子类
 * [email protected]
 * 2018-11-24
 *
钩子使用方法
//引用命名空间
use Ay\auto\Hook;
//添加钩子
Hook::add('ceshi',function(){
    echo '挂载点1
';
});
//运行钩子
Hook::listen('ceshi');

*/
namespace Ay\Auto; // 命名空间

// 插件类
class Hook{
    /**
     * Hook初始化
     */
    function __construct()
    {
        $dir = __DIR__ . "/plugin/";
        // 获取全部插件
        if(!is_dir($dir)){
            $pluginList = [];
        }else{
            $pluginList=scandir($dir);
        }
        foreach ($pluginList as $k => $v) {
            if ($v=='.' || $v=='..') {
                unset($pluginList[$k]);
            }
            $pluginList[$k] = $dir.$v;
        }
        //print_r($pluginList);
        foreach($pluginList as $val){
            if(!is_file($val."/config.php")) break;
            $config = include $val."/config.php";
            if($config['status'] == 0) break;
            is_file($val."/add.php") && include_once $val . "/add.php";
        }
    }

    /**
     *  注册添加插件
     * @param $name 钩子名称
     * @param $func 钩子使用的方法
     */
    public static function add($name,$func){
        $GLOBALS['hookList'][$name][]=$func;
    }

    /**
     * 监听插件
     * @param $name 钩子名称
     * @param null $params 钩子方法参数
     * @return mixed|void
     */
    public static function listen($name,$params=null){
        if(empty($GLOBALS['hookList'][$name])) {
            //钩子为空
            return;
        }
        foreach ($GLOBALS['hookList'][$name] as $k => $v){
            return call_user_func($v,$params);
        }
    }

    /**
     * listen的别名方法
     * @param $name
     * @param null $params
     * @return mixed|void
     */
    public static function run($name,$params=null){
        return self::listen($name,$params);
    }

}


转载请注明:七彩悠悠博客 | 心悠悠 情悠悠 » 简单的插件钩子系统

高效,专业,悠悠博客

联系我们