thinkphp的鉤子的兩種配置和兩種調用方法

來源:互聯網
上載者:User

標籤:理解   w3c   預設值   相對   function   內容   list   數組   ted   

   thinkphp的鉤子行為類是一個比較難以理解的問題,網上有很多寫thinkphp鉤子類的文章,我也是根據網上的文章來設定thinkphp的鉤子行為的,但根據這些網上的文章,我在設定的過程中,嘗試了十幾次都沒有成功,不過,我還是沒有放棄,最後還是在一邊調節細節,一邊實驗的過程中實現了鉤子行為的設定。下面是我個人的設定經驗,在這裡跟大家分享一下。

  個人做了兩種設定,都實驗成功了,一個簡單點,在thinkphp的核心檔案中模仿核心行為類添加了另一個行為類,下面是:

  我的虛擬機器主機設定檔夾是D:/think

  Thinkphp是tp架構檔案夾,配置過tp架構應該都知道Library是tp放核心檔案的檔案夾,Behavior檔案夾則是tp的鉤子行為類檔案的核心檔案夾,裡面放置著很多行為類檔案,我只是模仿這些鉤子行為類檔案在裡面建了一個鉤子行為類檔案adBehavior.class.php,內容如下:

<?phpnamespace Behavior;class adBehavior{    function run($arg){//在此介紹下,run必須的 ,細心的會在Think核心找到Behavior.class.php裡面有這樣一句話  abstract public function run(&$params);         echo ‘我是一條‘.$arg[‘name‘].‘廣告,‘.$arg[‘value‘].‘代言‘;    }}

  設定好了自訂的鉤子行為類之後,我們接下來就要利用這個鉤子行為類促發鉤子的行為了,```鉤子的行為```說白了其實就是促發鉤子行為類的run方法裡面的代碼執行,我這裡只是簡單的輸出run方法參數的內容,在應用中的,大家可以自由發揮。

  下面是促發行為的操作:

  解釋一下:我這裡是Home模組下面的IndexController控制器的登入方法

namespace Home\Controller;use Think\Controller;use Think\Hook;//引進促發鉤子行為的類,是為下面的Hook::add()調用做伏筆的class IndexController extends Controller {    public function login(){        //這裡我設定一個ad行為的標籤,也就是給我自訂的adBehavior鉤子行為類添加一個促發行為的標識        Hook::add(‘ad‘,‘Behavior\\adBehavior‘);        //第一個是執列標籤的名稱,第二個參數是行為的類的地址        Hook::add(‘test‘, "Home\\Behaviors\\testBehavior");        //Hook::add(‘test2‘, "Home\\Behaviors\\testBehavior");        $param=array(‘name‘=>‘testBehavior‘);        $param2=array(‘LIS‘=>‘LLISTION‘);        $param3=array(‘music‘=>‘cangjingshikong‘);        $this->assign(‘param‘,$param);        $this->assign(‘param‘,$param2);        $this->assign(‘param‘,$param3);        $this->display();    }

  下面是login模板內容:

<!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>ThinkPHP 行為(Behavior)擴充以及外掛程式(Plug or Hook)詳解(含執行個體)    </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‘=>‘*老師‘))}<div>————————————————分割線1——————————————————</div><div style="font-weight: bold ;color: #00ff00">{:hook(‘ad‘, array(‘name‘=>‘MV‘,‘value‘=>‘蒼井空老師‘))}</div><div>————————————————分割線2——————————————————</div>    <!--hook函數第一個參數是標籤的名稱,第二個參數隨意-->    <!--tag函數第一個參數是標籤的名稱,第二個一定是變數,因為tag函數是引址傳遞的參數--><div>hook函數:{:hook(‘test‘, array(‘name‘=>‘World‘))}<hr/></div><div>tag函數:{:tag(‘mv‘,$param)}<hr/></div><hr/><div>tag函數:{:tag(‘action_begin‘,$param)}</div></body></html>

  這裡的路徑我就不寫了吧,一般對tp架構瞭解的人都知道,這個模板login.html放在哪裡。

  關於這個模板的內容,我已經提前把下面要講述的另一種設定鉤子行為類方法的內容也放在這裡了,大家可以自行測試一下調用這個模板,如果你跟著我的思路設定了,我想它應該會輸出:

  

How to used?

我是一條AV廣告,*老師代言

————————————————分割線1——————————————————我是一條MV廣告,蒼井空老師代言————————————————分割線2——————————————————  呵呵,這裡引用蒼老師的作用,你懂的。  廢話不多說,下面是第二種自己設定行為類的方法,這裡我是根據tp架構的手冊以及諸位網友的網文自己測試成功了的,大家按照我的思路設定就行了。只有你配置對了,我想應該不會出現太多問題。  1、首先在你的模組下面建一個檔案夾Behaviors,再在Behaviors裡面建立自訂的鉤子行為類,鉤子行為類必須是xxxBehaviors.class.php的格式。  2、其次在你的模組下面的Conf檔案夾中新增一個檔案tags.php。  為什麼要這樣,這是tp的文法,你照做就行了,當然你自己也可以探究一下。  這樣子說或許還不夠形象,下面我還是上代碼吧,本人描述比較差。  先截個圖顯示路徑吧,免得有的同學還是摸不著頭腦。

 

  解釋一下上面的檔案夾,Conf檔案夾有的tp會自動產生,有的可能要你建立,Behaviors檔案夾則是要你建立的,下面還是上代碼:  在Behaviors檔案夾裡面(完整路徑D:\think\application\Home\Behaviors\testBehavior.class.php)我自訂的鉤子行為類的內容:
<?php/** * Created by PhpStorm. * User: Administrator * Date: 2016/7/17 * Time: 11:02 */namespace Home\Behaviors;/* * 註冊鉤子行為類,要觸發的行為寫在run函數裡 * */class testBehavior extends \Think\Behavior{    public function run(&$arg){       echo ‘test behavior=====下一行是參數<br/>‘.$arg[‘name‘];    }}

  在Conf檔案夾裡面(完整路徑D:\think\application\Home\Conf\tags.php,當然這是我的情況)tags.php的內容:

  

<?php/** * Created by zhuowenfeng. * User: Administrator * Date: 2016/7/17 * Time: 10:56 */return array(
//‘action_begin‘=>array(‘Home\\Behaviors\\test‘,‘Home\\Behaviors\\test‘),
   //一個標籤位可以有多個行為,使用數組即可。       // 如果是3.2.1版本 則需要改成    ‘action_begin‘=>array(‘Home\\Behaviors\\testBehavior‘,‘Home\\Behaviors\\testBehavior‘),   ‘mv‘=>array(‘Home\\Behaviors\\mvBehavior‘,‘Home\\Behaviors\\mvBehavior‘));

  解釋一下,上面tags.php檔案的內容,我配置了兩個行為標識,``action_begin``,``mv``,是跟login.html那裡相對應的,你可以回去仔細查看一下,login.html模板的內容,必定包含有``action_begin``,``mv``,這裡也是tp架構在tags.php設定行為標識的文法,要是想問為什麼可以自行探究,這裡不多說。

  還有請注意:上面那個被我注釋掉的‘action_begin’,其實是我的版本不適合這個文法,這是其他版本在tags.php配置行為標識的文法,這裡tp裡面的文檔說的比較清楚,我就不多說了。如果,你的版本和我不同,那麼請用上面的文法嘗試一下,如果用上面的文法配置還是沒辦法配置成功,那麼可能是你配置錯了。

  配置好了,那麼請你再嘗試調用模板login.html。我相信你一定能獲得你想要的配置結果的。

  這裡提醒一句,請認真看我所做的注釋,那裡可以說也包含了很多資訊。

  接下來,我要講講設定監聽鉤子行為類的兩個方法hook(),tag():

   這兩個函數都是tp內建監聽鉤子行為類的內建函數,可以在tp架構的函數庫functions.php檔案中找得到。這裡只講他們的調用區別,其實已經在login.html模板檔案中提到了,這裡就再次說明一下:

  兩個函數在functions.php的代碼:

/** * 擷取和設定配置參數 支援批量定義 * @param string|array $name 組態變數 * @param mixed $value 配置值 * @param mixed $default 預設值 * @return mixed */function hook($hook,$params=array()){    \Think\Hook::listen($hook,$params);        //監聽一個鉤子}/** * 處理標籤擴充 * @param string $tag 標籤名稱 * @param mixed $params 傳入參數 * @return void */function tag($tag, &$params=NULL) {    \Think\Hook::listen($tag,$params);}

  之所以在這裡展示一下這兩個函數的內容,是為瞭解釋它們的區別:

  細心的你應該發現tag函數的$param參數值裡前面帶了一個···&···符號,沒有錯:這個符號就是引用變數的地址符號,所以tag函數的$param參數只能是變數,請不要懷疑,你可以測試一下不是變數的情況,呵呵。

  它們的區別也在於此,hook可以引用任何參數,tag只能引用變數的參數

  上面那個tags.php檔案裡面我在每個標籤行為的後面都重複配置了testBehavior自訂類,是為了證明,一個標籤也可以對應多個行為類,如果你配置成功了,那麼你運行login.html的時候,肯定發現login根據testBehavior設定的執行了兩次。

  最後,總結一下:

  其實,我想說,tp架構的鉤子行為類無非就是為了在某個特定地點,特定時間促發某種行為,這個是應用很廣的,本人姑且這麼認為。比如,你想要在某個模板植入廣告,可以向我這樣子簡單的設定。

  然後,簡單的介紹tp行為的引用步驟:

  首先第一步,你要先配置好自己的行為類,這是毋庸置疑的。

  其次是促發的行為,你必須在你自訂的行為類的run裡面設定,在這裡實現你的任何行為,run方法就是你配置行為的地方。

  然後,就是配置tags.php的行為標識了,這裡你可以按照上面格式配置,當然,你有沒有細心的發現上面的IndexController.class.php裡面我多寫了幾行代碼:

 //第一個是執列標籤的名稱,第二個參數是行為的類的地址  Hook::add(‘test‘, "Home\\Behaviors\\testBehavior");

  其實這裡是動態添加行為標識的代碼,也就是說,鉤子行為的標籤行為,也就是標識也可以動態添加的,你可以試試。

  最後,就是監聽行為了,監聽行為就是引用tag方法或者hook方法了,在這裡你可以傳入參數,也可不傳,看你想怎麼做了。監聽行為你可以在模板上監聽,也可以在其他地方監聽,比如控制器的方法中,這裡就不舉例了,你可以自己試試,我之所以在模板中舉例,完全是為了看到效果,畢竟做實驗看不到你要的結果,是證明不了你的實驗是個成功的實驗的。

  多說一句,本人比較粗心,假如有什麼 文字錯誤 還請指出,或者自己腦補 ,呵呵。 

thinkphp的鉤子的兩種配置和兩種調用方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.