初做drupal的模块开发,了解了一下hook。
在大多数的资料中了解hook,由于之前c#做了很久很久,总将hook理解为类似event的东西。
在drupal执行某个步骤的时候就会调用模块里的hook。
这样理解是没错,而且大多数网上的资料也是这么描述的。
但是,不够全面。
稍微深入的实践以后,用面向对象的思路重新理解了hook机制。
比起event,hook机制更类似于面向对象语言中的interface。
可以这么看,drupal 有一个很大很大的interface,他叫module。所有的hook 都是module 这个interface定义好了的,包含函数和属性(从return中获取值后drupal创建相应的内容或物件,我将其看作是interface中的属性,为了好理解,毕竟所有东西都用函数来理解很容易混淆,虽然函数有返回值和没返回值都是存在的)
ok,自定模块,实际上就是被默认实现了module interface的一个派生类,developer们在自己的派生类中实现接口所要求的函数和属性,当然与面向对象的语言不同,drupal并没有要求在代码中将所有的hook的创建出来,而是很聪明的去筛选,代码中创建了的他就调用,没创建的,他就不管了(可以想象成,在你的module创建好以后,就产生了所有虚拟接口函数,不在代码中实现,就是没有复写override)。
写到这里,让我有另一个想法,其实还可以用抽象类型来理解drupal hook,不过无所谓,都可以。
drupal 运行,实际上是运行一个接口集合,这个接口集合在module 中创建info文件后,drupal会在某个时候将你的这个‘module interface’注册进这个接口集合。(当然具体是什么时候我还没去思考他,在模块开发上,只需要知道定义了info文件和module文件就能够注册上这个模块了,其他的不需要太关心)。
然后你的接口类型就完全融入在drupal中运行了,其他的等以后更清晰了再说吧。
这里只是用面向对象的方式理解一下hook ,分享一下我了解hook机制的方式。
标签
hook不再那么深不可测了