DolphinPHP钩子基于THINKPHP5

THINKPHP钩子就是所谓的插件

项目运行时需先调用注册钩子文件:

// 应用开始
'app_begin'    => [
    'app\\common\\behavior\\Config', // 注册配置行为
    'app\\common\\behavior\\Hook', // 注册钩子行为
],

将所有插件提前读取钩子项目插件表,将钩子数据存入\think\Hook对象中:

namespace app\common\behavior;

use app\admin\model\Hook as HookModel;
use app\admin\model\HookPlugin as HookPluginModel;
use app\admin\model\Plugin as PluginModel;

/**
 * 注册钩子
 * @package app\common\behavior
 * @author 蔡伟明 <314013107@qq.com>
 */
class Hook
{
    /**
     * 执行行为 run方法是Behavior唯一的接口
     * @access public
     * @param mixed $params  行为参数
     * @return void
     */
    public function run(&$params)
    {
        if(defined('BIND_MODULE') && BIND_MODULE === 'install') return;

        $hook_plugins = cache('hook_plugins');
        $hooks        = cache('hooks');
        $plugins      = cache('plugins');

        if (!$hook_plugins) {
            // 所有钩子
            $hooks = HookModel::where('status', 1)->column('status', 'name');
            // 所有插件
            $plugins = PluginModel::where('status', 1)->column('status', 'name');
            // 钩子对应的插件
            $hook_plugins = HookPluginModel::where('status', 1)->order('hook,sort')->select();
            // 非开发模式,缓存数据
            if (config('develop_mode') == 0) {
                cache('hook_plugins', $hook_plugins);
                cache('hooks', $hooks);
                cache('plugins', $plugins);
            }
        }

        if ($hook_plugins) {
            foreach ($hook_plugins as $value) {
                if (isset($hooks[$value['hook']]) && isset($plugins[$value['plugin']])) {
                    \think\Hook::add($value['hook'], get_plugin_class($value['plugin']));
                }
            }
        }
    }

模版中这样调用:

{:hook('admin_index')}

调用函数在app/common.php中

if (!function_exists('hook')) {
    function hook($name = '', $params = null, $extra = null, $once = false) {
        \think\Hook::listen($name, $params, $extra, $once);
    }
}

监听函数根据页面传递的钩子名称从对象提前存储的钩子信息中获取对应信息:

public static function listen($tag, &$params = null, $extra = null, $once = false)
    {
        $results = [];
        foreach (static::get($tag) as $key => $name) {
            $results[$key] = self::exec($name, $tag, $params, $extra);

            // 如果返回 false,或者仅获取一个有效返回则中断行为执行
            if (false === $results[$key] || (!is_null($results[$key]) && $once)) {
                break;
            }
        }

        return $once ? end($results) : $results;
    }

然后调用执行行为函数exec执行对应方法:

public static function exec($class, $tag = '', &$params = null, $extra = null)
    {
        App::$debug && Debug::remark('behavior_start', 'time');

        $method = Loader::parseName($tag, 1, false);

        $obj    = new $class();
        $method = ($tag && is_callable([$obj, $method])) ? $method : 'run';
        $result = $obj->$method($params, $extra);

        return $result;
    }

需注意执行文件中所对应的$method格式为 admin_index=>adminIndex 或者run方法

这里使用is_callable函数而不用method_exists函数是因为下面要执行该方法







  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
DophinPHP海豚PHP)是一个基于ThinkPHP5.0.3开发的开源PHP快速开发框架,秉承极简、极速、极致的开发理念,为开发集成了基于数据-角色的权限管理机制,集成多种灵活快速构建工具,可方便快速扩展的模块、插件、钩子、数据包。统一了模块、插件、钩子、数据包之间的版本和依赖关系,进一步降低了代码和数据的沉余,以方便开发者快速构建自己的应用。 ZBuilder构建类 DolphinPHP内置了强大的快速构建器,可以帮助开发者快速构建表单页面、数据表格和侧栏,以便让开发者专注于业务逻辑,而不用把过多的精力放在制作各种页面上,今后DolphinPHP将推出更多不同的构建器。 【表单构建】 表单构建器目前内置了多达30几种表单项类型,比如:单行文本、多行文本、百度编辑器、markdown编辑器、单选、多选、开关、联动、取色器、图标选择器、图片裁剪等等,只需几行代码,即可实现复杂且人性化的功能。 【数据表格】 为了让开发者专注于业务本身,DolphinPHP提供了一系列针对构建数据表格的方法,可以帮助开发者快速构建数据表格,集成快速编辑、模糊搜索、字段排序、字段搜索。 【侧栏构建】 DolphinPHP为大家提供了侧栏构建器,方便开发者把一些常用的设置,提示等放置在右侧,增强用户体验。 注意:软件需在php5.5以上的环境中才能正常运行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值