Fastadmin中Hook的使用

小计

最近一直在使用Fastadmin进行新系统的开发,安装了一些官方插件,不过对一些具体业务逻辑需要进行调整,发现在插件的使用中,大量使用了Hook::listen,Hook::add这样的方法。

上一篇博客中,对Hook的简单使用做了个简易的示范,可是发现插件中也使用了大量的Hook行为,却并没有在tags里声明,全盘搜索Hook::add,除了少数几个闭包函数,基本也没有用这个方法进行注册。

检查后发现,fastadmin-addon在初始化的时候应该是调用了
\vendor\karsonzhang\fastadmin-addons\src\common.php,其中75行左右可以看到如下代码

// 获取系统配置
    $hooks = App::$debug ? [] : Cache::get('hooks', []);
    if (empty($hooks)) {
        $hooks = (array)Config::get('addons.hooks');
        // 初始化钩子
        foreach ($hooks as $key => $values) {
            if (is_string($values)) {
                $values = explode(',', $values);
            } else {
                $values = (array)$values;
            }
            $hooks[$key] = array_filter(array_map('get_addon_class', $values));
        }
        Cache::set('hooks', $hooks);
    }
    //如果在插件中有定义app_init,则直接执行
    if (isset($hooks['app_init'])) {
        foreach ($hooks['app_init'] as $k => $v) {
            Hook::exec($v, 'app_init');
        }
    }
    Hook::import($hooks, true);

从\application\extra\addons.php中获取了插件的hook配置,然后在这里进行递归注册

(顺便一提,百度查找Hook::import似乎没什么人用,
可以理解为Hook::add的批量方法,第二个参数为true,就增加,如果是false,就会舍弃数组中已有定义的方法)
个人理解,欢迎指正

注册之后,之前留下的钩子,就会执行响应的class中的方法
本文主要是为了调整用户邀请注册之后的积分赠送逻辑,后续购物返利,或相关逻辑都可以用类似方式增加钩子,也可以自己写一个Hook配置文件,然后用import方式批量注册自己的一些Hook方法

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,自定义Hook可以搭配其他Hook使用。自定义Hook本质上就是一个函数,可以包括任何适用于函数组件的代码,包括其他Hook。这也是自定义Hook的一个重要特性:可以将多个相关的Hook封装成一个自定义Hook,使得这些Hook的逻辑更加清晰、易于复用和管理。 举个例子,假设我们需要在组件订阅某个事件,通常可以使用useEffect Hook来实现: ``` function MyComponent() { useEffect(() => { const subscription = eventEmitter.subscribe(handleEvent); return () => { subscription.unsubscribe(); }; }, []); function handleEvent() { // 处理事件逻辑 } return <div>My Component</div>; } ``` 如果多个组件都需要订阅同一个事件,那么可以将订阅逻辑封装成一个自定义Hook: ``` import { useEffect } from 'react'; import eventEmitter from './eventEmitter'; function useEventSubscription(handler) { useEffect(() => { const subscription = eventEmitter.subscribe(handler); return () => { subscription.unsubscribe(); }; }, [handler]); } export default useEventSubscription; ``` 这样,在其他组件就可以直接使用useEventSubscription Hook来订阅事件了: ``` import useEventSubscription from './useEventSubscription'; function AnotherComponent() { useEventSubscription(handleEvent); function handleEvent() { // 处理事件逻辑 } return <div>Another Component</div>; } ``` 可以看到,在自定义Hook可以使用其他Hook,这样可以让代码更加简洁、易于管理和复用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值