You are here

逐渐消失的钩子机制(Drupal8系列)

很早以前,我们学习Drupal的时候,都会被告知,钩子(Hook)机制,是Drupal中最核心的概念。在Drupal7里面,钩子大概分类3类:module_invoke_all调用的钩子,module_invoke调用的钩子,以及主题函数也被称之为主题钩子。

我曾经给人讲过,Drupal7,是最后一个面向过程的版本,而Drupal8则是第一个面向对象的版本。从面向过程,到面向对象,底层的代码经过了一系列的重构,这也使得Drupal能够充分的利用已有的语言层级的先进技术。

实际上,在Drupal7中,核心里面,很多地方都已经使用了面向对象的技术,但是此时的面向对象,只是起到辅助性质的作用,面向过程则是最基础的;但是这并不影响,第三方模块向面向对象的转变,很多的第三方模块,底层都是基于面向对象的。比如说Feeds、Views模块,而我在Drupal7下面所写的Field validation模块,第一版是面向过程的,第2版主要就是基于面向对象的。

在Drupal8中,面向对象是最底层的,钩子机制,将会被转为对应的面向对象的实现。对于module_invoke_all类型的钩子机制,将会专为面向对象的事件订阅机制,比如hook_node_insert;对于module_invoke调用的钩子,将会被转为插件的形式,比如hook_block。在Drupal8里面,钩子机制仍然是存在的,所不同的是,将是起辅助的作用。转换是有一个过程的,Drupal的钩子很多,不是一下子完成的,在转换的过程期间,两种机制同样有效,直到Drupal核心里面的钩子,全部转为事件订阅机制/插件机制以后。我估计,只有在Drupal9的时候,这种转变才会彻底完成。

钩子机制,使得Drupal的扩展性非常方便,但是它是有局限性的,比如说需要把所有的钩子实现放到module文件里面,一股脑的加载到内存里面,这使得Drupal就是一个内存杀手。Drupal7一度想实现自己的缓加载机制,但是只实现了对象的缓加载,对于面向过程的函数,仍然没有实现缓加载。而在Drupal8中,由于采用面向对象技术,而面向对象的缓加载技术相对成熟稳定,所以说Drupal8里面的缓加载是比较彻底的。

论坛:

Drupal版本: