Thinkphp实战利用钩子使用行为扩展 (Hook)

栏目: PHP · 发布时间: 8年前

内容简介:Thinkphp实战利用钩子使用行为扩展 (Hook)

上午研究了几篇关于使用Hook实现钩子的实例或详细描述,总结了一些,所以打算写两个实例深入记忆。

注意事项:

注意事项:

1.触发行为的关键方法是Hook类中的listen方法,它通过遍历某个行为标签下的所有行为,依次实例化并调用run方法

2.listen方法中,如果之前在配置文件中开启了DEBUG模式,则它会生成日志记录你的行为,这里面牵涉到3.很多的IO操作,所以你的项目完成时建议取消DEBUG模式以提升速度

3.listen方法中,允许传递参数且只允许传递一个参数(传多个可以用数组呢),不过这个参数是引用传值,所以只能传入变量,传入常量会报错

4.最后,Library/Think/Behavior.class.PHP,这个抽象类中只有一个抽象方法run(),在你的自己行为扩展中建议继承它,尽管这不是必须的,但是这样更加规范

实例1

1.在控制器中 Application->Home->Controller->IndexController.class.PHP 添加如下代码:

namespace Home/Controller; use Think/Controller; use Think/Hook;//引用Hook class IndexController extends Controller {     public function index(){         Hook::add('ad','Behavior//adBehavior'); //手动注册行为 ad 是注册行为的名称 后面的是路径 接下来会说如何新建路径中的文件         hook::listen('ad',$parnam);//触发行为 (这种是在控制器中触发行为,还有在html页面中触发行为的 接下来就会看到) $parnam 为想要带的参数 可以随便定义  html中触发的话请注释这句         $this->display();     } }

2.来新建一个行为取名叫ad(广告),ThinkPHP->Library->Behavior->adBehavior.class.PHP

在里面写入代码:

    namespace Behavior;     class adBehavior{         function run($arg){             //$arg为带过来的参数 可以在其中写入自己的业务逻辑 行为必须执行run              echo '我是一条'.$arg['name'].'广告,'.$arg['value'].'代言';        //在此介绍下,run必须的 ,细心的会在Think核心找到Behavior.class.php里面有这样一句操蛋的话  abstract public function run(&$params); 你懂的         }     }

3.在模板中使用 Application->Home->View->Index->index.HTML 添加如下代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml">  <head>     <title></title>     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     <meta name="description" content="Hook使用方法" /> </head> <body>     <h1>How to used?</h1>     {:hook('ad', array('name'=>'AV','value'=>'*老师'))} //这个呢就是在页面中触发行为的方式了 </body> </html>

4.还需要一步    如果我们想在模板上调用例如{:tag('example',array('name'=>'name','value'=>'value'))} 这样的方法,首先我们到 ThinkPHP->Common->functions.PHP,你会搜到 tag 这个方法,复制下 tag 方法,修改为

function hook($hook,$params=array()){     /Think/Hook::listen($hook,$params);        //监听一个钩子 }

实例1结束

实例2

实例一已经够详细了实例二是根据 http://www.jianshu.com/p/7fa08fceea5b 修改的 比较简洁 自动注册就不在列举

使用钩子触发行为扩展的流程:

1.自动注册(Common/Conf/tags.PHP按格式自己添加),或者 手动注册(类中方法如初始方法,调用Hook::add(tags,name));

2.写好自己的行为类,类名以Behavior结尾,实现run方法

3.在需要添加行为的函数里 ,直接Hook::Listen(tags,prarm),注意一定要传变量,不需要传常量。

例子:

Home/IndexController;中代码:

 public function index()      {                    //这里我是手动注册的行为          Hook::add('ads','Home/Behaviors/adsBehavior');//ads 为行为名称 后面的是路径          hook::listen('ads',$param);   //这个是监听触发行为 $param为传递的参数 可自定义      } }

新建 Home/Behaviors/adsBehavior.PHP

写入代码:

<?php namespace Home/Behavior; class adBehavior{     function run(&$param){          dump($param);                           //在这里面写逻辑代码即可         //在此介绍下,run必须的 ,细心的会在Think核心找到Behavior.class.php里面有这样一句操蛋的话           //abstract public function run(&$params); 你懂的     } }

OK,完成,刚刚超过下班2分钟。愉快下班。


以上所述就是小编给大家介绍的《Thinkphp实战利用钩子使用行为扩展 (Hook)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cyberwar

Cyberwar

Kathleen Hall Jamieson / Oxford University Press / 2018-10-3 / USD 16.96

The question of how Donald Trump won the 2016 election looms over his presidency. In particular, were the 78,000 voters who gave him an Electoral College victory affected by the Russian trolls and hac......一起来看看 《Cyberwar》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换