亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

Thinkphp實戰利用鉤子使用行為擴展 (Hook)

標簽:
PHP

上午研究了几篇关于使用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;//引用Hookclass 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
写入代码:

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

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



作者:jew丶
链接:https://www.jianshu.com/p/c035655c61b2


點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消