理解钩子
钩子是模块与其他附加模块或 Drupal 核心子系统交互的一种方式。钩子用于各种任务,包括模板文件的预处理变量(hook_preprocess())、修改信息列表(hook_tokens_alter()、hook_views_data_alter())以及操作表单(hook_form_alter())等。在此页面中列出了核心提供的所有钩子。
模块可以定义它们自己的附加钩子。例如,Flag 模块定义了 hook_flag_options_alter(),其他模块可以使用它来修改现有标志的默认选项。大多数定义钩子的模块也会提供相应的文档。这些文档通常位于 *.api.php 文件中。
钩子会出现在执行流程的不同点上,Drupal 会在这些点查找所有已启用模块的贡献。例如,当用户访问 Drupal 网站上的帮助页面时,Drupal 在生成帮助页面时会给每个模块提供机会来展示自己的文档。这是通过扫描所有启用模块是否实现了 hook_help() 来实现的。也就是说,命名为 mymodule_help($route_name, \Drupal\Core\Routing\RouteMatchInterface $route_match) 的函数,其中 “mymodule” 是模块名。例如,Block 模块的帮助钩子叫做 block_help(),Node 模块的帮助钩子叫做 node_help()。钩子还可以提供参数;hook_help 的 $route_name 和 $route_match 参数允许开发人员定义帮助消息应显示在哪些页面上。
钩子可以被看作是事件监听器,事件触发动作。Drupal 中的事件(例如节点删除)会触发 "hook_node_delete" 钩子。如果你的模块实现了 hook_node_delete,这个函数将在节点删除时执行。例如,你的函数可能负责减少节点总数,因此当节点被删除时,该函数会被调用并将总数减少 1。
另请参阅 模块钩子概览(Drupal API 手册)。你可能也会想查看这篇优秀的 文章,它使用简单的 PHP 结构/片段解释了 Drupal 模块/钩子系统的工作原理。