在接触drupal之初,就对drupal的hook机制有点迷糊,但是又想弄清楚.
今天总算明白了,其实很简单.
核心就是module_invoke_all
怎么理解呢
比如在模块module_a有一个函数module_a_test,模块module_b有一个函数module_b_test.当然,里面可以带参数.
在一个地方,执行$str = module_invoke_all(‘test’).
那么$str里面,就是两个模块里面,hook_test的返回值了.
下面,就可以foreach($str as $v)进行处理hook_test的返回值了.
就这最后一步一直犯迷糊.总算想通了.纪念一下.
PS: 突然之间,想明白了.所谓的hook,就是可以批量获得特定函数返回值的一个函数.
比如$menus = module_invoke_all(‘menu’);,$menus就是s所有函数名以_menu结尾function的的返回值.当然,前提是这个module要激活.
下面,就可以写程序对$menus进行各种处理了.
下面顺便说说module_invoke.其实就是调用函数.
比如module_invoke(‘kk’,’ss’,$str);
这个执行的结果,跟下面的函数一样.
kk_ss($str);
下面附上module_invoke函数原型
function module_invoke_all($hook) {
$args = function_exists($function)) {
$result = is_array($result)) {
$return = <a href="http://php.net/array_merge_recursive" _xhe_href="http://php.net/array_merge_recursive" title="" array="" array_merge_recursive(array="" $array1="" [,="" $...="" ])"="" class="php-manual" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-family: inherit; font-style: inherit; font-variant: inherit; font-weight: bold; line-height: inherit; vertical-align: baseline; color: rgb(0, 68, 136); text-decoration: none;">array_merge_recursive($return, $result);
}
elseif (isset($result)) {
$return[] = $result;
}
}
}
return $return;
}
源:http://dplor.com/archives/267
hook又叫钩子,其实是一个比较常见的插件机制,可以想象成事件触发机制,在页面请求的过程中,如果你觉得某个变量有可能需要被扩展,或者有可能有模块想做一些其他事情,那么就在那个点埋下一个钩子,程序运行到那个点时,会通过钩子机制,询问所有的模块是否实现了这个钩子(是否想在这个点做点什么),如果有,则调用模块实现的钩子回调,并执行。