Thinkphp實戰(zhàn)利用鉤子使用行為擴(kuò)展 (Hook)

上午研究了幾篇關(guān)于使用Hook實現(xiàn)鉤子的實例或詳細(xì)描述,總結(jié)了一些,所以打算寫兩個實例深入記憶。

注意事項:

注意事項:
1.觸發(fā)行為的關(guān)鍵方法是Hook類中的listen方法,它通過遍歷某個行為標(biāo)簽下的所有行為,依次實例化并調(diào)用run方法
2.listen方法中,如果之前在配置文件中開啟了DEBUG模式,則它會生成日志記錄你的行為,這里面牽涉到3.很多的IO操作,所以你的項目完成時建議取消DEBUG模式以提升速度
3.listen方法中,允許傳遞參數(shù)且只允許傳遞一個參數(shù)(傳多個可以用數(shù)組呢),不過這個參數(shù)是引用傳值,所以只能傳入變量,傳入常量會報錯
4.最后,Library\Think\Behavior.class.php,這個抽象類中只有一個抽象方法run(),在你的自己行為擴(kuò)展中建議繼承它,盡管這不是必須的,但是這樣更加規(guī)范

實例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);//觸發(fā)行為 (這種是在控制器中觸發(fā)行為,還有在html頁面中觸發(fā)行為的 接下來就會看到) $parnam 為想要帶的參數(shù) 可以隨便定義  html中觸發(fā)的話請注釋這句
        $this->display();
    }
}

2.來新建一個行為取名叫ad(廣告),ThinkPHP->Library->Behavior->adBehavior.class.php
在里面寫入代碼:

    namespace Behavior;
    class adBehavior{
        function run($arg){
            //$arg為帶過來的參數(shù) 可以在其中寫入自己的業(yè)務(wù)邏輯 行為必須執(zhí)行run 
            echo '我是一條'.$arg['name'].'廣告,'.$arg['value'].'代言';        //在此介紹下,run必須的 ,細(xì)心的會在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'=>'*老師'))} //這個呢就是在頁面中觸發(fā)行為的方式了
</body>
</html>

4.還需要一步 如果我們想在模板上調(diào)用例如{:tag('example',array('name'=>'name','value'=>'value'))} 這樣的方法,首先我們到 ThinkPHP->Common->functions.php,你會搜到 tag 這個方法,復(fù)制下 tag 方法,修改為

function hook($hook,$params=array()){
    \Think\Hook::listen($hook,$params);        //監(jiān)聽一個鉤子
}

實例1結(jié)束

實例2

實例一已經(jīng)夠詳細(xì)了實例二是根據(jù) http://www.itdecent.cn/p/7fa08fceea5b 修改的 比較簡潔 自動注冊就不在列舉

使用鉤子觸發(fā)行為擴(kuò)展的流程:

1.自動注冊(Common/Conf/tags.php按格式自己添加),或者 手動注冊(類中方法如初始方法,調(diào)用Hook::add(tags,name));
2.寫好自己的行為類,類名以Behavior結(jié)尾,實現(xiàn)run方法
3.在需要添加行為的函數(shù)里 ,直接Hook::Listen(tags,prarm),注意一定要傳變量,不需要傳常量。

例子:

Home\IndexController;中代碼:

 public function index()
     {
         
         //這里我是手動注冊的行為
         Hook::add('ads','Home\Behaviors\adsBehavior');//ads 為行為名稱 后面的是路徑
         hook::listen('ads',$param);   //這個是監(jiān)聽觸發(fā)行為 $param為傳遞的參數(shù) 可自定義
     }
}

新建 Home\Behaviors\adsBehavior.php
寫入代碼:

<?php
namespace Home\Behavior;
class adBehavior{
    function run(&$param){
         dump($param);        
                  //在這里面寫邏輯代碼即可
        //在此介紹下,run必須的 ,細(xì)心的會在Think核心找到Behavior.class.php里面有這樣一句操蛋的話  
        //abstract public function run(&$params); 你懂的
    }
}

OK,完成,剛剛超過下班2分鐘。愉快下班。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載自 http://blog.csdn.net/u013927110/article/details/47000...
    geeooooz閱讀 2,248評論 0 2
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,568評論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,058評論 25 709
  • 沒有信心 讓你了解我的心 沒有勇氣 向你告白我的情 但愿,在草叢中 默默地凝眸遠(yuǎn)望 采擷在烈日下你給的蔭涼
    默年先生閱讀 272評論 0 0
  • 今天搞衛(wèi)生的時候,不小心將小雪的沙漏摔爛了。小雪看見立馬哇哇大哭。 至于哭成那個樣子嗎?不就是一個擺設(shè)而已嗎?于是...
    簡潔如我閱讀 945評論 0 0

友情鏈接更多精彩內(nèi)容