AOP如何在Drupal中运行?

时间:2008-09-24 22:58:48

标签: drupal aop

AOP(面向方面​​编程)如何在Drupal中运行。我已经了解了AOP在使用它进行日志记录和安全性方面的问题,但它如何应用于Druoal?

2 个答案:

答案 0 :(得分:4)

drupal通过钩子模仿AOP范例,它基本上允许开发人员在执行流程中编织一些代码。您可以查看开发人员可以实现的钩子here

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

答案 1 :(得分: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_bootstrap_full() - code available here中调用)时,这是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's excellent blogpost