前面说了, Drupal的逻辑层由一个核心框架和一系列的功能模块(Module,可以看成插件)构成, 框架与模块间的协调就是通过钩子机制来实现, 所以钩子机制是Drupal模块化系统的关键。什么是钩子机制, 它与面向对象的接口(Interface)类似, 就是为规范定义了两个实体间的功能界面, 使得实现了该界面的实体能进行交互. 在Drupal里, 钩子就是Drupal框架与模块间进行交互的接口, 但由于Drupal没有面向对象的机制, 所以它采用编程规约来讨巧地实现.
在Drupal里, 钩子就是一系列需要实现特定功能的函数, 它们约定好了输入参数和返回类型, 同时约定以xxx_yyy() 的形式来命名, 其中xxx是要实现功能的模块名称,而yyy则是具体的钩子名称 . 举个例子, 你就更清楚了. 例如我有个模块叫myexamplemodule, 现在我想在footer中添加一些Javascript代码, 于是我在我的模块代码中实现一个叫myexamplemodule_footer()的函数, 在此函数中我实现了我想要功能; 于是用户请求页面时, Drupal的框架会检测到我的模块有myexamplemodule_footer()函数, 并且它会自动调用它, 是不是很简单明了呢! Drupal核心框架的这种调度机制, 屏蔽了用户自定义模块与框架间的实际交互, 简化了的开发, 因为你只要实现一个函数即可, 别的事情系统已经替你完成了. 更多的hook请查看Drupal的文档库.

Hook机制主要在模块管理(includes/module.inc)中实现, 主要有的四个主要函数, 非常简单.

module_hook($module, $hook)
判断某模块是否实现某钩子
module_implements($hook, $sort = FALSE, $refresh = FALSE)
判断哪些模块实现某钩子, 返回模块名数组
module_invoke()
调用具体模块的具体钩子, 变长参数, 参数包括模块名, 钩子名, 还有钩子函数的参数
module_invoke_all()
调用所有模块的具体钩子, 变长参数, 参数包括钩子名, 钩子函数的参数

下面看一下module_invoke_all()函数的具体实现, 该函数会在Bootstrap过程中被框架调用.

<?php
function module_invoke_all() {
       $args = func_get_args();
       $hook = $args[0];
       unset($args[0]);
       $return = array();
       foreach (module_implements($hook) as $module) {
          $function = $module .'_'. $hook;
          $result = call_user_func_array($function, $args); 
          if (isset($result) && is_array($result)) {
              $return = array_merge_recursive($return, $result);
          }
         else if (isset($result)) {
             $return[] = $result;
         }
  }
  return $return;
}
?>

Drupal的钩子实现起来也比较灵活, 不想实现某钩子, 不写那个函数即可, 这样可以减少PHP文件的代码, 提高效率. 不过看起来还是有些庞大的感觉, 因为只要实现了该钩子函数的模块, 就会被调用, 这样应该会导致在输出某内容时, 系统还会加载并执行其他无关的模块. 总之, 粗浅一看, 这里应该是个性能瓶颈.

转载于:https://www.cnblogs.com/liuye/archive/2013/01/15/2861184.html

从头学习Drupal--基本架构二相关推荐

  1. 从头学习Drupal--基本架构三

    菜单(Menu) 前面曾经简单提到过Drupal的菜单, 今天稍微深入来探讨一下. 菜单能用来显示导航信息, 我们安装的系统, 默认安装有3个菜单, 让我们查看一下数据库吧, 以menu_开头的总共有 ...

  2. Hadoop学习之HDFS架构(二)

    HDFS可以跨越大集群中的机器可靠地存储非常大的文件,将文件存储为一系列的块,除了最后一个块外,所有的块的大小都是相同的.当然若文件大小正好为块大小的倍数则所有块的大小相同.为了容错的目的,一个文件的 ...

  3. BizTalk学习笔记系列之二:实例说明如何使用BizTalk

    BizTalk学习笔记系列之二:实例说明如何使用BizTalk --.BizTalk学习笔记系列之二<?XML:NAMESPACE PREFIX = O /> Aaron.Gao,2006 ...

  4. MySQL服务器学习笔记!(二) ——数据库各项操作

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://foreveryan.blog.51cto.com/3508502/657640 ...

  5. 【论文知识点笔记】Binarized P-Network(强化学习+保守值迭代+二值化神经网络)

    Binarized P-Network(强化学习+保守值迭代+二值化神经网络) 一.强化学习 1. 特点 2. 介绍 3. 知识点 4. 原理 4.1. 马尔科夫决策过程(MDP) 二.保守值迭代(C ...

  6. 基于实时深度学习的推荐系统架构设计和技术演进

    简介:整理自 5 月 29 日 阿里云开发者大会,秦江杰和刘童璇的分享,内容包括实时推荐系统的原理以及什么是实时推荐系统.整体系统的架构及如何在阿里云上面实现,以及关于深度学习的细节介绍 本文整理自 ...

  7. 学习之模块架构 DotNetNuke 6

    前面的博客介绍了: 如何在本地安装DNN6 如何创建DNN模块 博客园原文地址 :  学习之模块架构 DotNetNuke 6 这篇博客主要是讲模块的架构和加载,以及模块与DotNetNuke门户网站 ...

  8. Kinect开发学习笔记之(二)Kinect开发学习资源整理

    Kinect开发学习笔记之(二)Kinect开发学习资源整理 zouxy09@qq.com http://blog.csdn.net/zouxy09 刚刚接触Kinect,在网上狂搜资料,获得了很多有 ...

  9. 【自然语言处理】【多模态】OFA:通过简单的sequence-to-sequence学习框架统一架构、任务和模态

    OFA:通过简单的sequence-to-sequence学习框架统一架构.任务和模态 <Unifying Architectures, Task, and Modalities through ...

最新文章

  1. vlc web 登录账号_怎么在web网页端解绑敬业签绑定的手机号?
  2. Java配置多数据源access,java联接MS ACCESS,无需配置数据源
  3. python经济学函数_有没有python计量经济学的教程?
  4. 为什么要娶就娶电力女?!
  5. 【AI视野·今日NLP 自然语言处理论文速览 第一期】Fri, 4 Jun 2021
  6. Ubuntu下安装nginx支持rtmp和http流媒体方案
  7. 状态机详解(一段式、二段式、三段式)
  8. 购买计算机英语情景对话,英语情景对话之购物英语:买相机
  9. SVC vs SVR
  10. python 实例解析--村长选举
  11. 浅析Gompertz模型
  12. Error opening archive: Failed to open ‘/Users/**\**/Library/
  13. STM32使用串口中断接收HWT101的数据
  14. Makefile文件
  15. arduino使用oled代码_【教程】在ESP32上使用E32433T LoRa模块
  16. Power BI业绩杜邦分析
  17. setInterval使用过程中报Uncaught SyntaxError: Unexpected identifier
  18. Matlab利用plot作图线形颜色等选择
  19. 突然发现得考个研究生了
  20. MySQL 内核原理分析(一)

热门文章

  1. 好程序员大数据技术分享:Zookeeper集群管理与选举
  2. C++基础:C++类成员属性的一种简洁实现
  3. 用C语言实现常见的三种中文内码转换
  4. linux之history命令
  5. Thrift RPC 系列教程(5)—— 接口设计篇:struct enum设计
  6. placeholder的样式设置
  7. 【内存泄露】Memory Leaks 内存优化
  8. ORA-00257: archiver error. Connect internal only, until freed 错误的处理方法
  9. hadoop2.6.0实践:002 检查伪分布式环境搭建
  10. JS面向对象高级特性