Drupal的钩子(Hooks)

      Drupal怎么就知道什么时候调用一个模块来处理特定的请求?

      这个是通过Drupal的hook机制完成的,下面解释一下hook的工作机制。

      当Drupal处理来自用户的一个请求,它通过一系列步骤进行。比如:Drupal核心首先引导这个应用,确定关键变量和经常使用的功能。接下来,它加载关键库、主题和模块。接下来,它继续处理请求,将请求的URI映射到正确的处理代码,等等。然后它为数据应用一个主题,为输出来格式化信息。最后它返回输出结果到用户的浏览器。

      在循序渐进的预定义时刻,Drupal进行勾取。这意味着什么呢?简短的说,它意味着Drupal测试部分或全部当前启用的模块,寻找遵循特定的预定义模块的函数。一些已经连接这个进程到“回调”的模式经常被用在事件处理模块中。Drupal和这个是类似的,但是更加充满活力。

      比如说,当它正在创建一个页面浏览内容时,Drupal可能再模块中寻找叫做<modulename>_block()和<modulename>_view()的函数(在这里<modulename>被每个Drupal检测的模块的名称代替)。寻找模块包含的这些函数被叫做实施hook_block()和hook_view()勾取。

      当Drupal找到这些函数,它执行它们,并且利用这些函数返回的数据创建一个响应来发送给用户。然后Drupal继续循序渐进的处理请求,或许在它进行过程中执行许多其它的钩子。

      当所有的步骤完成并且一个响应发送给用户,Drupal自动清除并且推出。

      模块可以定义自己的钩子,这些钩子又可以被其他模块使用。这样一来,hook机制可以扩展到提供复杂的定制行为。

      当一个模块提供匹配一个钩子的签名的功能,我们就说那个模块执行那个钩子。比如,假设Drupal有一个叫做hook_example()的钩子。如果我们定义一个叫做 mymodule 并且包含一个叫做 mymodule_example() 函数的模块,我们就会用到 hook_example().

 

      Hook对于面向对象程序员的启示:

      那些对面向对象编程熟悉的程序员可能发现在面向对象语言中考虑将钩子作为一个类似于接口方法或者抽象方法的机制是很有用的。钩子是Drupal将寻找的函数并在某些情况下需要出现在你的模块中。就像接口方式,一个钩子的函数签名必须匹配Drupal的预期签名。而和接口不同的是,模块开发者可以选择(在一定程度上)哪个钩子去实现、哪个钩子去忽视。Drupal不要求每个定义的钩子都实现。

 

参考:《Learning Drupal 6 Module Development》

posted on 2010-04-16 18:06  Candyroot  阅读(3485)  评论(1编辑  收藏  举报