**钩子函数,简单的理解就是,当系统执行完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);
}
}