91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

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

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

thinkphp是什么

thinkphp屬于一種免費的開發框架,能夠用于開發前端網頁,最早thinkphp是為了簡化開發而產生的,thinkphp同時也是遵循Apache2協議,最初是從Struts演變過來,也把國外一些好的框架模式進行利用,使用面向對象的開發結構,兼容了很多標簽庫等模式,它能夠更方便和快捷的開發和部署應用,當然不僅僅是企業級應用,任何php應用開發都可以從thinkphp的簡單、兼容和快速的特性中受益。

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

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

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

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

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

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

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

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

3.2.1版本之前

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

3.2.1版本之后

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

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

不得不說一下,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 插件或者行為存在時才執行
          $addon   = new $class();
          return $addon->$tag($params);
       }
   }

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

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

  • 行為的觸發

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

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

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

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

插件的定義,在plugins目錄下,插件名作為文件夾test,下面有testPlugin.class.php,這樣的結構才能被tp找到,這里只是一個簡單的主體Controller,test插件文件夾可以根據情況配置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'; //另一個插件鉤子的執行入口
        }
    }

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

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

向AI問一下細節

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

AI

石河子市| 闵行区| 绥滨县| 陈巴尔虎旗| 永和县| 浑源县| 务川| 綦江县| 新沂市| 区。| 武义县| 肃宁县| 双峰县| 青河县| 北票市| 南靖县| 商城县| 德庆县| 双桥区| 昭平县| 溆浦县| 青岛市| 额济纳旗| 嘉兴市| 利辛县| 林甸县| 六安市| 芜湖市| 高阳县| 建水县| 新郑市| 浦东新区| 宣化县| 营山县| 宝山区| 乌恰县| 余江县| 宜宾市| 龙井市| 务川| 玉环县|