phpcms v9 hook扩展

什么是hook?直接翻译过来,就是钩子。这是一个术语也没什么。

钩子有什么好处呢?举个例子:

当我们先开发出一个会员模块,然后会员模块里面有一个删除会员的功能。我们在删除会员之前埋下一个钩子。这个叫钩子的埋点。如下代码:

1 <?php
2 $userid intval($_GET['userid']);//接收要删除的会员ID
3 $this->db->delete(array('userid'=>$userid));//删除会员
4 hook::get_instance('member_delete_user')->run($userid);//埋下一个钩子传入被删除的会员ID
5 ?>

后来由于需要,我们开发了一个文章系统,文章系统跟会员是关联的,所以删除会员也要把会员的文章一起删掉
在删除会员的时候我们就可以把这个member_delete_user钩子启用,再删除完会员之后把会员的文章也删掉。这样就不用修改到会员模块的代码。phpcms v9里面也有这个hook 但是官方没有怎么使用。而且也有局限。

现在我们来对phpcms v9的hook.class.php进行修改。代码如下:

01 <?php
02 /**
03  *  hook.class.php 钩子类
04  *
05  * @copyright           (C) 2013 蝉印网络
06  * @license             http://www.chanyinkeji.com
07  * @lastmodify          2013-4-30
08  * @qq                  183517940
09  */
10 class hook {
11     private static $_instance array();
12     protected $hooks array();
13     
14     private function __construct($hookkey) {
15         $modules = getcache('modules','commons');
16         if(is_array($modules) && !empty($modules)){
17             foreach($modules as $k=>$v){
18                 //查找每个模块下hooks目录里面config.php文件是否存在
19                 $path = PC_PATH.'modules'.DIRECTORY_SEPARATOR.$v['module'].DIRECTORY_SEPARATOR.'hooks'.DIRECTORY_SEPARATOR;
20                 $file $path.'config.php';
21                 if(is_file($file)){
22                     include_once $file;
23                 }
24             }
25             if(isset($hook[$hookkey]) && is_array($hook[$hookkey])){
26                 foreach($hook[$hookkeyas $k=>$v){
27                     $this->hooks[] = $v;
28                 }
29             }
30         }
31     }
32     /**
33      * 获取钩子实例对象
34      *
35      * @param string $hookkey 钩子名
36      * @return Hook
37      */
38     public static function get_instance($hookkey) {
39         if (!isset(self::$_instance[$hookkey])) {
40             self::$_instance[$hookkey] = new self($hookkey);
41         }
42         return self::$_instance[$hookkey];
43     }
44     
45     //运行钩子,传入参数
46     public function run() {
47         if (!$this->hooks) return;
48         $args = func_get_args();
49         foreach ($this->hooks as $key => $v){
50             if(is_file($v['filename']) && $v['class'] && $v['function']){
51                 include_once $v['filename'];
52                 $class new $v['class'];
53                 call_user_func_array(array($class,$v['function']), $args);
54             }
55         }
56     }
57 }
58 ?>

phpcms v9 hook使用方法:

在任意模块下(模块必须安装过才生效)新建一个hooks的文件夹,比如:phpcms/modules/content/hooks/
在目录里新建config.php,在里面写入如下代码:

1 //$hook['钩子名']
2 $hook['pre_controller'][] = array(
3     'class'    => 'myclass',//类名
4     'function' => 'init',//方法名称
5     'filename' => PC_PATH.'modules'.DIRECTORY_SEPARATOR.'模块目录名'.DIRECTORY_SEPARATOR.'hooks'.DIRECTORY_SEPARATOR.'myclass.class.php',//注意模块目录名和类名
6 );

当 php执行到

1 hook:get_instance('pre_controller')->run();

时就会运行phpcms/modules/模块目录/hooks/myclass.class.php代码 

 
© 2001-2017 MYSZIIT.COM. All Rights Reserved.