【发布时间】:2008-09-24 22:58:48
【问题描述】:
AOP(面向方面的编程)如何在 Drupal 中工作?
我已经了解了 AOP 在日志记录和安全方面的用途,但它如何应用于 Drupal?
【问题讨论】:
AOP(面向方面的编程)如何在 Drupal 中工作?
我已经了解了 AOP 在日志记录和安全方面的用途,但它如何应用于 Drupal?
【问题讨论】:
Drupal 通过钩子模仿 AOP 范式,这基本上允许开发人员在执行流程中编织一些代码。您可以查看开发人员可以在 Drupal 文档站点中显示的 list of Drupal hooks 上实现的钩子,其中仅列出了从 Drupal 核心及其模块调用的钩子。
举个简单的例子,如果我正在开发一个新的基于节点的模块(节点是 Drupal 中的基本数据形式),我可以立即访问 cmets 和分类法,而无需我做任何额外的工作。注释和分类模块能够连接到节点,并提供附加功能。所以从这个意义上说,我不必在我的程序中考虑这些功能,但我可以利用这种灵活性。
【讨论】:
Drupal 是一个“多范式”框架,只有部分部分实现了“一种”AOP:
Drupal 的 AOP 范式可能更好地可视化为事件驱动,而这一切都通过 Drupal 的钩子概念发生。例如,当您执行以下操作时:
mymodule_init()函数你声明的是伪代码:
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 的多范式性质,Programming language trade-offs,作者:Larry Garfield。
【讨论】: