AOP(面向方面编程)在 Drupal 中是如何工作的?
我已经了解了 AOP 在日志记录和安全性方面的使用,但它如何应用于 Drupal?
Drupal 通过钩子模仿 AOP 范式,这基本上允许开发人员在执行流程中编织一些代码。您可以在 Drupal 文档站点中显示的 Drupal 钩子列表中查看开发人员可以实现的钩子,该列表仅列出了从 Drupal 核心及其模块调用的钩子。
举个简单的例子,如果我正在开发一个新的基于节点的模块(节点是 Drupal 中的基本数据形式),我可以即时访问评论和分类,而无需我做任何额外的工作。注释和分类模块能够连接到节点,并提供附加功能。所以从这个意义上说,我不必在我的程序中考虑这些功能,但我可以利用这种灵活性。
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 的多范式性质,编程语言权衡,作者:Larry Garfield。