首页 > 后端开发 > php教程 > 新的 Drupal Hook 属性

新的 Drupal Hook 属性

Linda Hamilton
发布: 2024-12-30 01:01:10
原创
175 人浏览过

New Drupal Hook attribute

在新版本公告中,有些东西引起了我的注意。从标题就知道是Hook属性。
对于不熟悉 php 属性的人,我不久前写了一篇关于它的文章。

自从 Drupal 8 转向面向对象的代码结构方式以来,添加钩子的方式对我来说很碍眼。
使用模块名称作为函数前缀并使用 .module 文件添加所有函数对我来说有一种非常意大利面条代码的感觉。

现在他们几乎修复了它。几乎是因为有一堆仍然是程序性的钩子。计划是删除 Drupal 12 中的程序挂钩,因此在下一个 Drupal 小版本中,我们将看到这些挂钩消失。

有什么好处?

挂钩不是将函数添加到 .module 文件中,而是位于模块的 src 目录中。
我建议使用 Hooks 子目录以便于识别。或者在类名中添加 Hooks 后缀

因为它是一个属性,所以您可以将多个钩子绑定到同一个方法。

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
登录后复制
登录后复制

对于维护 11.1 之前的 Drupal 版本模块的人来说,有一个额外的属性,LegacyHook。这允许您将钩子的代码移动到具有钩子属性的类中。老版本的Drupal会执行.module文件中的函数,但新版本只会执行类方法。

// module.module
#[LegacyHook]
function module_comment_insert(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}

#[LegacyHook]
function module_comment_update(CommentInterface $comment) {
   new CommentHooks()->commentInsertOrUpdate($comment);
}
登录后复制

如何使用 Hook 属性

正如您从前面的代码示例中看到的,属性已添加到方法中。

但是您也可以将方法添加到类中。

#[Hook('comment_insert')]
#[Hook('comment_update')]
class CommentManipulationHook {
  public function __invoke(CommentInterface $comment) {
    // do something
  }
}
登录后复制

正如我在示例中所示,我建议使类名称更具描述性。并使用后缀 Hook 而不是 Hooks。

可以为类添加Hook属性,并将方法添加为第二个参数。我不推荐这样做,在这种情况下,将属性添加到方法中会更干净。

还有第三个 Hook 参数,module。这允许您从另一个模块执行钩子类。例如#hook('comment_insert', 'commentInsert', 'my_comment_module')。
我一直在考虑这个的用例,但我找不到任何用例。
如果你知道的话请告诉我。

结论

我喜欢看到 Drupal 代码朝着正确的方向发展。

令我困扰的一件事是钩子是魔法常量。但计划是所有的 hooks 属性都以 Hook 属性为基类。因此,#[Hook('comment_insert')] 将会是 #[CommentInsert]。
他们可以做到这一点的另一种方法是使用枚举,按模块分组。

// module.module

function module_comment_insert(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_update(CommentInterface $comment) {
   module_comment_manipulation($comment);
}

function module_comment_manipulation(CommentInterface $comment) {
  // do something
}

// with Hook attribute 
class CommentHooks {

  #[Hook('comment_insert')]
  #[Hook('comment_update')]
  public function commentInsertOrUpdate(CommentInterface $comment) {
    // do something
  }
}
登录后复制
登录后复制

这篇文章中的信息基于文档和我对实现的快速了解。当我测试了该功能后,将会发布更新或附加帖子。

以上是新的 Drupal Hook 属性的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板