深入理解钩子函数的使用

**钩子函数,简单的理解就是,当系统执行完A操作之后,发射一个信号,告诉系统,我现在做了A操作,后续的事情就是,当系统刚好要在A操作执行完毕后,要进行一系列(B/C/D……)操作的时候,就在另外的地方去接收发射的信号,从而调用需要执行的方法,来完成后续的操作。 那么如果你不使用钩子函数而是使用普通的函数调用的话,就需要在执行完A操作之后,紧接着在其后去执行一大片B/C/D操作,而这只是一次调用,如果系统中多次执行了A操作的话,那必然要多次执行B/C/D操作,简单的讲,就是减少耦合。

如下,我先创建了一个申请,添加完数据之后,我发射了一个信号,说我在这里创建完了**

public static function createApply($postID, $transfer_person, $receive_person, $monitor_person)
    {
        $returnData = 0;
        if ($transfer_person == '') {
            $transfer_person = \OC_User::getUser();
        }
        $returnData = Database::add($postID, $transfer_person, $receive_person, $monitor_person);
        if ($returnData > 0) {
            \OC_Hook::emit(/**signalclass**/'OCA\PostTransfer', /**signalname**/'post_createPostTransfer', /**param**/array('transfer_id' => $returnData));
        }
        return $returnData;
    }

之后我接收到信号开始处理:

public static function initHooks()
    {
        \OC_Hook::connect(/**sigalclass**/'OCA\PostTransfer', /**signalname**/'post_createPostTransfer', /**slotclass**/'\OCA\PostTransfer\Hooks', /**slotname**/'post_createPostTransfer');
    }

去执行如下的方法:

\OCA\PostTransfer\Hooks::initHooks();
public static function post_createPostTransfer($params)
    {
        $transferID = $params['transfer_id'];
        $transferInfo = Helper::getTransferInfo($transferID);
        $postView = new \OC\Files\View('/' . \OC_Post::POST_FOLDER);
        if ($postView->is_dir('/' . $transferInfo['post_id'])) {
            self::correctPostFolder($transferInfo['monitor_person']);
        }
    }

1.注册一个信号,同时传递参数(可以传递多个参数);

\OC_Hook::emit('OC_User', 'post_deleteUser', array('uid' => $user->getUID()));

2.在需要的地方接收信号,去对应的方法里面去执行函数,函数的参数是由emit发放传递过来的(可以多次调用注册的信号);

\OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_Team', 'post_deleteUser');
\OC_Hook::connect('OC_User', 'post_deleteUser', 'OC_Agent', 'post_deleteUser');

3.定义具体的方法,在具体类下(OC_Team)定义具体的方法’post_deleteUser’;

class OC_Team{//OC_Team类
    public static function post_deleteUser($parameters) {
            $uid = $parameters['uid'];
            foreach (OC_Team::getAdminsByUid($uid) as $tid) {
                OC_Team::removeAdminFromTeam($uid, $tid);
            }
            foreach (OC_Team::getTeamsofUser($uid) as $tid) {
                OC_Team::removeMemberFromTeam($uid, $tid);
            }
            return true;
        }

}

//在具体类下(OC_Agent)定义具体的方法'post_deleteUser';
class OC_Agent{//OC_Agent类
    public static function post_deleteUser($params)
        {
            $uid = $params['uid'];
            $agentID = self::getUserAgent($uid);
            self::removeAgentAdminUser($agentID, $uid);
            self::removeAgentUser($agentID, $uid);
        }

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值