`

Drupal的钩子原理

阅读更多

从头学习Drupal--基本架构二

<!-- start main content -->
xeopn 于 周六, 2008-06-21 00:11 提交。

前 面说了, 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文件的代码, 提高效率. 不过看起来还是有些庞大的感觉, 因为只要实现了该钩子函数的模块, 就会被调用, 这样应该会导致在输出某内容时, 系统还会加载并执行其他无关的模块. 总之, 粗浅一看, 这里应该是个性能瓶颈.

分享到:
评论

相关推荐

    Drupal专业开发指南(Drupal5)

    这包括理解钩子(hooks)的概念及其在Drupal中的作用,以及如何利用API来实现特定功能。 - **主题开发**:对于前端开发者来说,学习如何创建自定义主题是必不可少的。这不仅涉及CSS和HTML的知识,还需要了解Drupal的...

    drupal入门第一步

    Drupal是一款强大的开源内容管理系统,广泛用于构建复杂且功能丰富的网站。...在后续的学习中,你还可以深入研究Drupal的节点、视图、区块、菜单系统,以及如何利用钩子和自定义模块扩展Drupal的功能。

    drupal安装文件

    此外,熟悉 PHP 和 Drupal 的钩子系统(Hooks)对于深度定制网站功能至关重要。 总的来说,Drupal 是一个功能强大的 CMS,适合有一定技术背景的用户使用。通过 "drupal-5.12" 安装文件,初学者可以开始探索 Drupal ...

    drupal高级开发手册

    - **模块生命周期**:解释Drupal模块的工作原理,包括启动、配置、钩子(Hooks)等关键概念。 - **自定义模块**:指导开发者如何从零开始创建自定义模块,并详细介绍模块结构、文件组织方式等内容。 - **API使用**:...

    drupal的一套相关学习资料.rar

    Drupal 的源码是其核心组成部分,通过阅读源码,开发者可以理解 Drupal 的工作原理,包括模块系统、主题引擎、数据库查询等。源码分析有助于自定义开发和性能优化,对于深入学习 Drupal 的架构和设计模式至关重要。...

    Drupal7 theme samoca

    Drupal7主题Samoca是一个专为Drupal7内容管理系统设计的网页模板,它被广泛用于学习和实践...通过对它的深入探索,开发者不仅可以提升技能,还能更好地理解Drupal7的工作原理,从而创建出更多美观且功能强大的网站。

    Drupal 集成淘宝TOP用户认证

    8. **Drupal钩子和事件**:了解如何使用Drupal的钩子(hooks)和事件系统来监听用户行为,并在适当的时候触发与淘宝API的交互。 9. **配置管理和部署**:集成过程中的配置管理,包括如何在开发、测试和生产环境中...

    drupal7 自己写的扩展模块 news

    Drupal 7 是一个开源的内容管理系统(CMS),它允许用户创建和管理网站,具有高度的可扩展性和灵活性。...对于想要深入理解 Drupal 工作原理或开发自己的 Drupal 模块的人来说,这是一个很好的学习案例。

    Drupal高手建站技术手册

    接着,书中会深入讲解Drupal的架构,帮助读者理解其工作原理,以便更好地进行后续的网站构建和定制。 Drupal的模块化设计是其灵活性和扩展性的重要体现。本书会详细解释如何配置已有的模块,以及如何为满足特定需求...

    drupal的例子可以看看

    标题提到的"drupal的例子可以看看",显然是鼓励我们通过实例来深入理解Drupal的工作原理和使用方法。在描述中反复提到“可以看看”,进一步强调了查看和学习Drupal实例的重要性。 Drupal的核心特性包括模块化设计、...

    Drupal专业开发指南 第二版(中文) for Drupal6

    《Drupal专业开发指南 第二版(中文) for Drupal6》是一部深入探讨Drupal 6版本的专业教程,旨在帮助开发者和网站...虽然现在Drupal已经发展到8和9版本,但了解Drupal 6的基本原理仍然有助于理解更现代版本的演变历程。

    drupal7源码和文档

    本资源包含的"Pro Drupal 7 Development.pdf"是一本专业指南,旨在帮助读者深入理解Drupal 7的架构、工作原理以及如何有效地开发和定制Drupal站点。 首先,我们要了解Drupal的基本概念。Drupal是由多个模块、主题、...

    UsingDrupal中文版+Drupal专业开发指南(中文版)

    通过这两本书的学习,无论是新手还是经验丰富的开发者,都能深入理解Drupal的工作原理,提升在实际项目中的应用能力。同时,掌握Drupal不仅可以提升个人技能,还有助于拓宽职业发展路径,参与到更广泛的Web开发项目...

    drupal专业开发指南

    #### Drupal工作原理概览 **什么是Drupal?** Drupal是一款开源内容管理系统(CMS),基于PHP语言开发,适用于构建各种规模的网站,包括个人博客、企业门户、社区论坛等。Drupal的核心特性在于其高度的可扩展性和...

    Drupal专业开发指南

    - **钩子、动作和触发器**:Drupal使用钩子系统来扩展功能,允许开发者注册回调函数,这些函数会在特定事件发生时自动执行。动作和触发器则用于响应用户的操作或系统的状态变化。 #### 三、Drupal核心组件详解 - *...

Global site tag (gtag.js) - Google Analytics