【问题标题】:How does AOP apply to Drupal?AOP 如何应用于 Drupal?
【发布时间】:2008-09-24 22:58:48
【问题描述】:

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

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

【问题讨论】:

    标签: drupal aop


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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 的多范式性质,Programming language trade-offs,作者:Larry Garfield。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多