溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

ThinkPHP中鉤子、行為擴展和插件機制的示例分析

發(fā)布時間:2021-03-04 13:50:35 來源:億速云 閱讀:271 作者:小新 欄目:編程語言

小編給大家分享一下ThinkPHP中鉤子、行為擴展和插件機制的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

thinkphp是什么

thinkphp屬于一種免費的開發(fā)框架,能夠用于開發(fā)前端網(wǎng)頁,最早thinkphp是為了簡化開發(fā)而產(chǎn)生的,thinkphp同時也是遵循Apache2協(xié)議,最初是從Struts演變過來,也把國外一些好的框架模式進行利用,使用面向?qū)ο蟮拈_發(fā)結(jié)構(gòu),兼容了很多標簽庫等模式,它能夠更方便和快捷的開發(fā)和部署應(yīng)用,當然不僅僅是企業(yè)級應(yīng)用,任何php應(yīng)用開發(fā)都可以從thinkphp的簡單、兼容和快速的特性中受益。

ThinkPHP的鉤子、行為擴展和插件機制

今天研究了一下ThinkPHP的鉤子,也算是框架的核心功能之一了,感覺很不錯。主要的兩個方向就是行為擴展和插件,這兩個都是業(yè)務(wù)邏輯比較獨立的,無需改動框架即可實現(xiàn)某個功能。

行為(Behavior),以下從tp3.2手冊摘了一段,還是比較好理解的。

你可以想象成在應(yīng)用執(zhí)行過程中的一個動作或者處理,在框架的執(zhí)行流程中,各個位置都可以有行為產(chǎn)生,例如路由檢測是一個行為,靜態(tài)緩存是一個行為,用戶權(quán)限檢測也是行為,大到業(yè)務(wù)邏輯,小到瀏覽器檢測、多語言檢測等等都可以當做是一個行為,甚至說你希望給你的網(wǎng)站用戶的第一次訪問彈出Hello,world!這些都可以看成是一種行為,行為的存在讓你無需改動框架和應(yīng)用,而在外圍通過擴展或者配置來改變或者增加一些功能。

你用來標記某個行為的名稱,我們就稱之為標簽(tag),tp框架里有內(nèi)置的系統(tǒng)標簽,如app_init、app_begin等,這些標簽就標記某些位置的行為(處理該行為)。

行為標簽的定義,一般是在配置文件中 Common/conf/tags.php

    return array(
        'mytest' => array('Portal\\Behavior\\testBehavior'),
    );

這里前面就是鉤子,而后面的array 是執(zhí)行為處理的位置,可以對應(yīng)多個,是按順序依次執(zhí)行。這是自動鉤子定義,還可以手動定義標簽

3.2.1版本之前

 \Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');

3.2.1版本之后

  \Think\Hook::add('action_begin','Home\\Behaviors\\test1Behavior');

兩個方法都是可以的,這里需要注意一下,現(xiàn)在很多網(wǎng)上關(guān)于鉤子和行為的博客解說的都是3.2.1之前的,是按照插件的路徑去找執(zhí)行方法的。

不得不說一下,tp這里的處理比較坑。。

   static public function exec($name, $tag,&$params=NULL) {
       if('Behavior' == substr($name,-8) ){
          // 行為擴展必須用run入口方法
          $class = $name;
          $tag    =   'run';
       }else{
          $class   =  "plugins\\{$name}\\{$name}Plugin";
       }
       if(class_exists($class)){ //ThinkCMF NOTE 插件或者行為存在時才執(zhí)行
          $addon   = new $class();
          return $addon->$tag($params);
       }
   }

這里檢測了class不存在之后啥都沒有,debug下不記錄日志也沒trace,也是醉了。

上面的代碼寫的很清楚,$name是指tag的執(zhí)行路徑,如果name后綴為Behavior的就作為行為擴展執(zhí)行,如果不是,則作為plugns下的插件執(zhí)行。

  • 行為的觸發(fā)

兩種方式,看代碼就知道其實就是tag調(diào)用Hook:listen

    \Think\Hook::listen('標簽名'[,參數(shù)]);   
    
    tag('標簽名'[,參數(shù)]);
  • 行為擴展

行為擴展的定義,run在父類中是抽象方法所以必須重寫run方法,而行為擴展的入口就是run方法,有且只有一個run。

 <?php
    namespace Home\Behaviors;
    class testBehavior extends \Think\Behavior{
        //行為執(zhí)行入口
        public function run(&$param){
    
        }
    }
  • 插件

插件的定義,在plugins目錄下,插件名作為文件夾test,下面有testPlugin.class.php,這樣的結(jié)構(gòu)才能被tp找到,這里只是一個簡單的主體Controller,test插件文件夾可以根據(jù)情況配置Controller、model、view等模塊,簡直不要太強大。

  <?php
    namespace plugins\test;    
    use  Common\Lib\Plugin;
    class testPlugin extends Plugin {
        public function mytest($param){
           echo 'this is plugin test-mytest';
        }
        
        public function yourtest($param){
           echo 'this is plugin test-yourtest'; //另一個插件鉤子的執(zhí)行入口
        }
    }

和行為擴展不同,一個插件中可以包含多個方法,作為不同鉤子的的處理方法,這應(yīng)該是最大的區(qū)別。

以上是“ThinkPHP中鉤子、行為擴展和插件機制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學習更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI