Kohana的Events和Hooks研究

标签 : ,

Kohana是一个使用PHP5的面向对象的MVC框架,是从CodeIgniter衍生出来,研究了几天,感觉还不错,就是它的文档实在太简陋了,在看到它的Events机制和Hooks机制时,确实有点不明白,文档上说的实在太简单了,后来我在Google上搜索了一下,找到两篇文章《Events and hooks in Kohana》《Practical Kohana Hooks example: PHPIDS》,上面讲了一下Kohana的Events和Hooks,并举了例子,我也开始慢慢理解了它的含义。

在Kohana的Events中,默认定义了很多的Events(例如system.ready、system.pre_controller等等),中文理解就是事件,也就是触发点,在程序在运行到某个位置时,会被触发,具体就是调用Event::run方法,我们在Kohana.php里可以看到在不同的位置执行了不同的Event::run方法,那么Hooks的意义在于当一个事件被触发之前,可以通过已加载的Hooks来修改事件的回调,有点绕口,说白了就是在事件发生之前,做点事情,举个例子,你安排了今天的日程,下午3点要开会,那么在3点开会就是一个Event(事件),那么到3点的时刻,你希望提醒你一下,你在你的手机里定了一个闹钟,在3点的时候会响,这就是一个Hook,可以看出Hook是基于Event的。

我们可以创建自己的Hook程序,并加载如默认的Events里,但是默认的Events不一定能满足我们的需要,比如我们在Web应用中经常使用的权限校验,判断这个用户是否登陆过,我们虽然可以使用默认Events里的system.pre_controller,但是这个Event是针对所有的Controller的,有些Controller是不需要校验用户的,还好Kohana允许自己定义Event,下面我们还是举例说明吧。

要使用Hooks,首先要在application/config/config.php里将$config['enable_hooks']置为TRUE。

之后我们定义自己的Event,我们在application/controllers目录下建立base.php,代码如下:

1
2
3
4
5
6
7
class Base_Controller extends Controller  {
 
	public function __construct() {
		parent::__construct();
		Event::run("base.construct");
	}	
}

我们继承了Kohana的Controller,在构造函数里定义了Event,名字叫“base.construct”,以后我们的Controller都继承自Base_Controller,那么在对象创建的时候都会触发base.construct事件。

Hook的文件放在application/hooks下,我们就创建一个hook文件sessioncheck.php,代码如下:

1
2
3
4
5
6
7
8
9
class SessionCheck {
 
	public function check() {
		echo "check session ...";
	}
 
}
 
Event::add('base.construct', array('SessionCheck','check'));

我们将SessionCheck的check方法加载到了base.construct事件上,也就是在触发base.construct事件之前,会执行SessionCheck的check方法。

接下来我们写一个Controller,在application/controllers目录下建立first.php,代码如下:

1
2
3
4
5
6
7
class First_Controller extends Base_Controller  {
 
	public function index() {
		echo "First - index";
		exit();
	}
}

我们执行一下看看会有什么提示,http://localhost/kohana/first,显示

check session …First – index

没问题了,在Controller构造时,执行了Hook里的方法。

Comments:

发表评论

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word