## 钩子
TookPHP框架提供了钩子处理机制,就是在某一个时机自动执行某些功能。
#### 配置钩子
a. 定义 Hook 配置项
b. 配置可以定义在应用或模块 config.php 文件中
*例:*
~~~
return array(
'Hook'=> array(
'TEST_HOOK' => array('Home\Hook\TestHook'),
),
);
~~~
*钩子文件, 路径: `Home\Hook\TestHook.class.php`*
~~~
namespace Home\Hook;
class TestHook{
public function run(&$options){
header('Content-type:text/html;charset=utf-8');
echo '设置字符集UTF8';
}
}
~~~
在控制器中调用钩子
~~~
namespace Home\Controller;
class IndexController extends Controller
{
public function index()
{
Hook::listen('TEST_HOOK');
//代码将执行输出: 设置字符集UTF8
}
}
~~~
#### 钩子处理类
a. 一个钩子可以指定多个处理类
b. 处理类可以定义在应用或模块的 Hook 目录
c. 处理类的后缀为 Hook.class.php
d. 如果应用与模块有同名钩子时,只会执行模块的钩子
e. 处理类必须有 public function run(&$param) 方法
#### 系统钩子
| 钩子名称 | 说明 |
| -- | -- |
| APP_INIT | 应用初始化 |
| APP_BEGIN | 应用运行前 |
| APP_END | 应用运行后 |
| CONTROLLER_START | 模块执行前 |
| CONTROLLER_END | 模块执行后 |
| VIEW_START | 模板显示前 (display 方法执行前 ) |
| VIEW_END | 模板显示后 (display 方法执行后 ) |
#### Hook::listen
使用 Hook::listen() 方法来执行定义好的钩子的所有处理类。
执行 USER_VALID 钩子
~~~
\Took\Hook::listen('USER_VALID');
~~~
#### Hook::exec
使用 Hook::exec() 方法执行一个钩子处理类
执行 LoginHook.class.php 处理程序类
~~~
\Took\Hook::exec('LoginHook');
~~~
### Hook 钩子类
Addon 与 Hook 的操作都是使用 Took\Hook.class.php 类完成的,下面介绍Hook类的内部方法。
#### add 添加钩子
~~~
static public function add($hook, $action)
@param $hook 钩子名称
@param $action 处理类
~~~
#### get 获得钩子信息
~~~
static public function get($hook = '')
@param string $hook 钩子名
~~~
#### import 批量导入钩子
~~~
static public function import($data, $recursive = true)
@param $data 钩子数据
@param bool $recursive 是否递归合并
~~~
#### listen 监听钩子
~~~
static public function listen($hook, &$param = null)
@param $hook 钩子名
@param null $param 参数
~~~
#### exec 执行钩子
~~~
static public function exe($name, $action, &$param = null)
@param $name 钩子名
@param $action 钩子方法
@param null $param 参数
~~~