我对Drupal的hook功能和Yii的beahavior理解

学艺未精,欢迎拍砖。 :)

玩过drupal的Yiier都知道,drupal吸引人的地方在于,它有强大的hook。自己建一个module的话,定义的函数只要符合一定的规范,那么在执行请求的时候,都会执行到自己建的module的函数,这样做的好处是什么呢?好就好在,处理请求的时候,自己想对那些数据怎么弄就怎么弄,加上一些数据啊,改变原来的数据啊都可以,到了最后输出的时候就会达到自己想到的结果。

由于我用Yii的实际经验不是很多,特别是behavior这一块,还真的没有体验到它的强大的地方,只是偶尔会在model里面用用那个自动插入时间,不过我看了CTimestampBehavior这个类,大概的意思是,覆盖beforeSave方法,这样在model进行save的时候,随着model的onBeforeSave一起使用,实际上CTimestampBehavior也是使用onBeforeSave的,不过在CActiveRecordBehavior这个父类里面,已经对这个方法进行了重命名为beforeSave(这是我在CActiveRecordBehavior的events()方法里面看到有这样的array,是这样理解它的重命名吧?),不知道这样算不算做hook,不过从我上面对drupal理解描述来看,功能相当于hook。

ok,说说Yii的module(应该说是,基本上现在流行的framework都是这样,我知道的如,zend framework,cakephp,QeePHP),基本上是,一个module是实现一个功能,而不是对数据的有一个流水线的处理(请原谅我见识比较浅薄,我暂时还是觉得是这样的),什么是流水线处理数据呢?就好比一个纸箱是怎么弄出来,首先只是一些木桨,经过机器1,变成一张纸皮,经过机器2,变成一个方形结构,再经过人工后期的稍微修饰,就可以变成一个纸箱,这过程就是对木桨这个“数据”的操作,每个机器相当于一个module,整个过程是一个流水线~

在我的理解内,既然behavior相当于做hook,那么module要怎么来实现这样的功能呢?做一个module,按照一定的规范就可以对现有的数据进行自己的处理?

当然,我也明白,这不是Yii要做的东西,因为Yii只是框架而不是应用,不过如果真的要用Yii来做像drupal(肯定不是像drupal这样啦,drupal偏向于面向过程。。。),用Yii做这样的CMS,该如何做module来实现那样的hook功能呢?用behavior?貌似没有一个叫做CControllerBehavior的类进行hook。

不懂不懂,描述得也比较混乱,希望大家能够看得明白我在说什么, :P

Yii的module概念和常见CMS里的module概念是不一样的。实际上,module这个概念的定义本身就是五花八门的。在Yii里,一个module就是完整包含M, V, C的一块可重用的代码。在CMS,module可能需要做更多的事,需要符合更多CMS特定的规范。而且很多CMS并没有很清楚划分MVC。

和hook相当的应该是yii里的事件。behavior是更底层的对多重继承的一种模拟(又叫作mixin)。

event更晕。。。手册里面都没有介绍的。。。囧

明天要再研究一下event才行,谢谢qiang哥

补充:

哪里有使用event的例子的?

behavior是一种动态的给对象增加method的方法(传统的多重继承可以看作是静态的)