5

AOP(面向方面​​编程)在 Drupal 中是如何工作的?

我已经了解了 AOP 在日志记录和安全性方面的使用,但它如何应用于 Drupal?

4

2 回答 2

4

Drupal 通过钩子模仿 AOP 范式,这基本上允许开发人员在执行流程中编织一些代码。您可以在 Drupal 文档站点中显示的 Drupal 钩子列表中查看开发人员可以实现的钩子,该列表仅列出了从 Drupal 核心及其模块调用的钩子。

举个简单的例子,如果我正在开发一个新的基于节点的模块(节点是 Drupal 中的基本数据形式),我可以即时访问评论和分类,而无需我做任何额外的工作。注释和分类模块能够连接到节点,并提供附加功能。所以从这个意义上说,我不必在我的程序中考虑这些功能,但我可以利用这种灵活性。

于 2008-09-24T23:29:13.567 回答
2

Drupal 是一个“多范式”框架,只有其中的某些部分实现了“一种”AOP:

  • 例如,Drupal 7 的 render() 函数通过基于基本优先规则选择适当的模板将一组嵌套数组转换为输出 HTML:这样,Drupal 的行为很像 XSLT 转换引擎,您的主题的模板文件在其中一起构成一个输入 .xsl 文件,输入数组嵌套是初始 .xml 文件。这意味着主题化的工作方式具有优雅的功能。
  • 此外,D7 数据库抽象层接近于“直接”面向对象,尽管正如 Larry(见下文)所指出的,在这个 OO 层中有少量的准 AOP。

Drupal 的 AOP 范式可能更好地可视化为事件驱动,而这一切都通过 Drupal 的钩子概念发生。例如,当您执行以下操作时:

  • 编写一个名为 mymodule 的模块
  • 在 mymodule.module 中,创建一个mymodule_init()函数
  • 在 Drupal 中安装这个模块

您要声明的是伪代码:

subscribe mymodule to "hook events" of type init

然后当 Drupal 的核心运行module_invoke_all('init')时,Drupal 说:

notify all subscribers to "hook events" of type init that this has occurred
 by passing any relevant arguments to them
 and letting them run the code they define in their hook_init()

因此,尽管 PHP 仍然是一种过程语言——mymodule_init()如果你真的想要,你可以做各种疯狂的、未封装的事情——Drupal 仍然负责。Drupal 在某种意义上决定是否首先调用您的代码。

通过这种方式,Drupal 能够将自己的执行阶段转变为准 AOP,通过定义关节点module_invoke*()函数)并让您编写自己的切入点(您的mymodule_*()函数,其命名约定必须与 Drupal 的钩子名称匹配。

有关这方面的更多背景信息,尤其是 Drupal 的多范式性质,编程语言权衡,作者:Larry Garfield。

于 2012-07-11T12:11:07.227 回答