phpcms v9 hook扩展
发表时间:2013-04-30 19:59:40 编辑:admin
什么是hook?直接翻译过来,就是钩子。这是一个术语也没什么。
钩子有什么好处呢?举个例子:
当我们先开发出一个会员模块,然后会员模块里面有一个删除会员的功能。我们在删除会员之前埋下一个钩子。这个叫钩子的埋点。如下代码:
<?php
$userid = intval($_GET['userid']);//接收要删除的会员ID
$this->db->delete(array('userid'=>$userid));//删除会员
hook::get_instance('member_delete_user')->run($userid);//埋下一个钩子传入被删除的会员ID
?>
后来由于需要,我们开发了一个文章系统,文章系统跟会员是关联的,所以删除会员也要把会员的文章一起删掉!
在删除会员的时候我们就可以把这个member_delete_user钩子启用,再删除完会员之后把会员的文章也删掉。这样就不用修改到会员模块的代码。phpcms v9里面也有这个hook 但是官方没有怎么使用。而且也有局限。
现在我们来对phpcms v9的hook.class.php进行修改。代码如下:
<?php
/**
* hook.class.php 钩子类
*
* @copyright (C) 2013 蝉印网络
* @license http://www.chanyinkeji.com
* @lastmodify 2013-4-30
* @qq 183517940
*/
class hook {
private static $_instance = array();
protected $hooks = array();
private function __construct($hookkey) {
$modules = getcache('modules','commons');
if(is_array($modules) && !empty($modules)){
foreach($modules as $k=>$v){
//查找每个模块下hooks目录里面config.php文件是否存在
$path = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$v['module'].DIRECTORY_SEPARATOR.'hooks'.DIRECTORY_SEPARATOR;
$file = $path.'config.php';
if(is_file($file)){
include_once $file;
}
}
if(isset($hook[$hookkey]) && is_array($hook[$hookkey])){
foreach($hook[$hookkey] as $k=>$v){
$this->hooks[] = $v;
}
}
}
}
/**
* 获取钩子实例对象
*
* @param string $hookkey 钩子名
* @return Hook
*/
public static function get_instance($hookkey) {
if (!isset(self::$_instance[$hookkey])) {
self::$_instance[$hookkey] = new self($hookkey);
}
return self::$_instance[$hookkey];
}
//运行钩子,传入参数
public function run() {
if (!$this->hooks) return;
$args = func_get_args();
foreach ($this->hooks as $key => $v){
if(is_file($v['filename']) && $v['class'] && $v['function']){
include_once $v['filename'];
$class = new $v['class'];
call_user_func_array(array($class,$v['function']), $args);
}
}
}
}
?>
phpcms v9 hook使用方法:
在任意模块下(模块必须安装过才生效)新建一个hooks的文件夹,比如:phpcms/modules/content/hooks/
在目录里新建config.php,在里面写入如下代码:
//$hook['钩子名'] $hook['pre_controller'][] = array( 'class' => 'myclass',//类名 'function' => 'init',//方法名称 'filename' => PC_PATH.'modules'.DIRECTORY_SEPARATOR.'模块目录名'.DIRECTORY_SEPARATOR.'hooks'.DIRECTORY_SEPARATOR.'myclass.class.php',//注意模块目录名和类名 );
当 php执行到
hook:get_instance('pre_controller')->run();
时就会运行phpcms/modules/模块目录/hooks/myclass.class.php代码


