在新版本公告中,有些东西引起了我的注意。从标题就知道是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('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中文网其他相关文章!