行為擴展以及插件機制

?在thinkPHP中的行為擴展和插件機制。

首先行為擴展這個概念是TP框架的核心組成之一,關于行為的解釋我就粗略的概括一下吧:

TP在從接受到HTTP請求到最終將試圖輸出,期間經歷的很多步驟,這些步驟大家可以在http://document.thinkphp.cn/manual_3_2.html#system_process這里面看到。

那么行為擴展實際上就是在這些流程里面買下了一個鉤子,你可以往鉤子里添加你自己的業務邏輯

當程序執行到某些鉤子位置時將自動觸發你的業務邏輯,http://document.thinkphp.cn/manual_3_2.html#behavior_extend。

本文的主要目的是教大家如何使用行為擴展和插件,這里為什么要提到“插件”這個詞呢?

因為在3.2里,有了一個插件的概念,和行為公用的HOOK類,所以放在一起說,原理上并無

并無太大區別。

-、行為擴展?

1.TP 內置行為鉤子

我們知道TP中預留一些行為鉤子,比如action_begin,這個鉤子實在動作開始執行時觸發,

預置的鉤子大家購過配置文件注冊行為類,大家在Application/Common/Conf目錄下創建一個

tags.php。這個和3.1是一樣的,返回一個數組。

數組個會是“鉤子名”=>“array(“行為類”,“行為類2”......................)”

這里我給一個例子:

Application/Common/Conf/tag.php:

<?php

return array(

"action_begin"=>array("Behaviors\\test")

);

?>

可以看到,我往action_begin這個鉤子里面注冊一個行為,這個行為就是Beha\\test這里

的寫法是命名空間寫法,其對應的類文件路徑是:

Application/Behaviors/testBehavior.class.php:

<?php

namespace Behaviors;

class testBehavior{

function run ($arg){

? echo "這里是一行為擴展"。$arg;

}

}

?>

千萬要注意第一行的命名空間,對于命名空間不理解的請自行查閱php手冊。

另外對于TP的自動加載機制,參考手冊:

http://document.thinkphp.cn/manual_3_2.html#autoload

行為的執行入口是run()方法,觸發鉤子時會自動執行行為類里的run()方法。

2.動態添加鉤子和注冊行為

通過上面的而梨子大家才是了解了行為大概是個什么東西,但是對于其執行流程

可能還不清楚,這里我來介紹下動態添加鉤子和注冊行為,是大家對行為執行機制

有一個比較清晰的理解。

首先,行為鉤子添加和注冊行為類,以及處罰行為,都是通過Hook類來實現的。

Hook類在TP核心包里的ThinkPHP目錄下,Hook.class.php。

>>添加鉤子以及注冊行為:\Think\HooK::(‘鉤子名’,‘行為’)

>>埋設/監聽/觸發鉤子:\Think\Hook::listen(‘鉤子名’,‘傳遞給run的參數,必須是個變量’ );

假如我們需要在訪問index.php/Public/login.html的時候觸發login鉤子里的行為,

那么首先我們需要在login方法中監聽鉤子,也就是把鉤子埋在login方法里,當訪問login方法就是

自動觸發,有點像獵人的陷阱。

function login(){

\Think\Hook::listen('login');

}

好了,我們在login方法里監聽了login鉤子,那么接下來我們往這個鉤子里添加一些行為,

這樣訪問login的時候會自動觸發這些行為,執行行為類的run方法。

行為在哪里注冊了?

1.你可以通過tags.php注冊,上面提到過了,只不過把action_begin換成login.

2.動態添加,假如這個鉤子只在Public控制器中使用,那么你可以子啊PUblicController的

_initialize()初始化方法腫么的動態添加鉤子。

function _initialeze(){

\Think\Hook::add('login','Behaviors\\test');

}

這里就往login這個鉤子里添加一個test行為,比較懶直接從上面復制下來。

可以同時添加多個行為類

\Think\Hook::add('login',array('Behaviors\\test','Behaviors\\test1'....));

就是第二個參數變成一個數組,數組里面每個元素對于一個行為類。

?

3.帶參數的行為

上面我們知道了行為是通過run()方法執行的,那么我們想傳遞一些參數進去怎么辦呢?

答案是\Think\Hook::listen();的第二個參數。

注意listen方法定義如下:

static public function listen($tag,&$param-NULL)

可以看到第二個參數是一個引用傳遞的參數,也就是說第二個參數必須是一個變量,不能是值,

下面的使用方法是錯誤的:
\Think\Hook::listen('login',"hello"); // x
這樣才是正確的
$hello = "hello";
\Think\Hook::listen('login',$hello);//√

這樣我們在行為類里面run方法可以指定一個參數來接收$hello
function run($arg){
echo $arg;//輸出 hello
}
當然你也可以
function run(&$arg){
echo $arg;//輸出hello
$arg = "bye";
}
這樣參數設定為引用類型,你可以在run里面改變原始變量的值。

二、插件

看了上面的行為,我們可以總結出一個模式:
定義不同的行為,執行同一個方法run ,而插件呢?

他是可以定義在run的并且相當于在一個行為類里面可以有多個入口,這些入口在不同的條件下觸發。

假設我們在tags.php里面添加了這樣一個鉤子

'showflash’=>array('test');

注意與行為的區別,注冊行為需要包含命名空間也是反斜杠\\,當沒有反斜杠,只有一個單詞的時候將認為是一個插件。

插件定義在Application/Addons/插件名/插件名Addon.class.php

插件類的定義

<?php
namespace Addons\test;
class testAddon{
function showflash(){
echo "這是插件執行入口";
}
}
?>

可以看出來一個明顯的區別,就是run入口變成了showfalsh,和鉤子名相同。

假如我們再來一個鉤子:

''=>

?

轉載于:https://www.cnblogs.com/yeyublog/p/6081147.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394626.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394626.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394626.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python android 庫_Python庫

Gevent Gevent是一個基于greenlet的Python的并發框架&#xff0c;以微線程greenlet為核心&#xff0c;使用了epoll事件監聽機制以及諸多其他優化而變得高效。 于greenlet、eventlet相比&#xff0c;性能略低&#xff0c;但是它封裝的API非常完善&#xff0c;最贊的是提供了一個…

ios 應用商店_如何在預算范圍內制作值得應用商店使用的iOS應用預覽

ios 應用商店Back in 2014, Apple made it possible to add an app preview to the the App Store. App previews are the best way to show potential users what your app has to offer before they download the app. In fact, users are 3x more likely to install an app …

搭建nfs共享存儲服務之二nfs服務端配置

1.1.NFS服務端配置文件路徑為&#xff1a; /etc/exports&#xff0c;并且默認為空&#xff0c;需要用戶自行配置。/etc/exports文件配置格式為&#xff1a;NFS共享的目錄 NFS客戶端地址1&#xff08;參數1&#xff0c;參數2...&#xff09;客戶端地址2&#xff08;參數1&#x…

計算機word基本知識選擇題,2017計算機基礎考試選擇題「附答案」

2017計算機基礎考試選擇題「附答案」一、單項選擇題(每題1.5分&#xff0c;共30分)1、文件名使用通配符的作用是(b)A、減少文件名所占用的磁盤空間B、便于一次處理多個文件C、便于給一個文件命名D、便于保存文件2、操作系統是一種(a)A、系統軟件 B、系統程序庫 C、編譯程序系統…

[JLOI2015]管道連接(斯坦納樹)

[Luogu3264] 原題解 多個頻道,每個頻道的關鍵點要求相互聯通 詳見代碼,非常巧妙 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #define debug(...) fprintf(stderr,__VA_ARGS__) #define Debug(…

關于web前端的學習路線

第一階段&#xff1a; HTMLCSS:HTML進階、CSS進階、divcss布局、HTMLcss整站開發、 JavaScript基礎&#xff1a;Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、ECMAscript、DOM、BOM、定時器和焦點圖。 JS基本特效&#xff1a;常見特效、例如&#xff1a;tab、導航、整頁…

值大于為此列指定的允許精度_電能質量測試精度會受到哪些因素影響?如何解決?...

關于電能質量&#xff08;也稱為PQ:Power Quality&#xff09;研究的主題已成為多方面的話題。其需要考慮的不僅僅是IEC 61000-x-x電磁兼容性標準中規定的實際電能質量現象。在實踐中&#xff0c;通常還會增加其他重要參數來保證供電的安全性&#xff0c;在某些情況下這些參數甚…

SEO博客

http://www.chinamyhosting.com/seoblog/分類: SEO 本文轉自快樂就好博客園博客&#xff0c;原文鏈接&#xff1a;http://www.cnblogs.com/happyday56/archive/2008/05/10/1191435.html&#xff0c;如需轉載請自行聯系原作者

gis計算各省河流長度_用河流和各方解釋安全漏洞

gis計算各省河流長度by Andrea Zanin由Andrea Zanin 用河流和各方解釋安全漏洞 (Security Vulnerabilities Explained with Rivers and Parties) Security vulnerabilities can be boring to learn. But you still need to learn them, unless you want some hacker to delete…

Delphi關于記錄文件的操作

http://www.cnblogs.com/railgunman/archive/2010/08/16/1801004.html Delphi關于記錄文件的操作 本例子幾個變量的說明TFileRec record   //記錄定義Day : Integer;...          //其他定義end;f : File of TFileRec;   //標準的輸入/輸出文件FilRec : TFileR…

pygame游戲開發入門例子

# *_* coding:utf-8 *_*# 開發團隊:中國軟件開發團隊# 開發人員:Administrator# 開發時間:2019/3/23 11:16# 文件名稱:pygame_demo# 開發工具:PyCharmimport sysimport pygameimport timedef main(): sizewidth,height640,480 pygame.init() screenpygame.display.set…

HTML引入媒體查詢CSS,CSS3 多媒體查詢

CSS3 多媒體查詢CSS2 多媒體類型media 規則在 CSS2 中有介紹&#xff0c;針對不同媒體類型可以定制不同的樣式規則。例如&#xff1a;你可以針對不同的媒體類型(包括顯示器、便攜設備、電視機&#xff0c;等等)設置不同的樣式規則。但是這些多媒體類型在很多設備上支持還不夠友…

Codeforces 835 F Roads in the Kingdom(樹形dp)

F. Roads in the Kingdom(樹形dp) 題意&#xff1a; 給一張n個點n條邊的無向帶權圖 定義不便利度為所有點對最短距離中的最大值 求出刪一條邊之后&#xff0c;保證圖還連通時不便利度的最小值 $n < 2e5 $\(w_i < 1e9\) 思路:樹形dp 這個圖是一個環上掛著很多顆樹&#xf…

前端websocket獲取數據后需要存本地嗎_是什么讓我放棄了restful api?了解清楚后我全面擁抱GraphQL...

GraphQL初步認識背景REST作為一種現代網絡應用非常流行的軟件架構風格&#xff0c;自從Roy Fielding博士在2000年他的博士論文中提出來到現在已經有了20年的歷史。它的簡單易用性&#xff0c;可擴展性&#xff0c;伸縮性受到廣大Web開發者的喜愛。REST 的 API 配合JSON格式的數…

列出薪金高于在部門30_我如何在五個月內將薪金提高一倍并獲得一份了不起的工作...

列出薪金高于在部門30by Sam Williams通過山姆威廉姆斯 我如何在五個月內將薪金提高一倍并獲得一份了不起的工作 (How I Doubled my Salary in Five Months and Got an Amazing Job) Six months ago I quit my job as a junior JavaScript developer and travelled around sou…

ftp服務器 vsftpd搭建和配置以及虛擬用戶的設置

tp: File Transfer Protocol應用層協議&#xff1a;tcp, 21/tcpC/S&#xff1a;Client: 程序Server: 程序數據&#xff1a;命令連接&#xff1a;文件管理類命令&#xff0c;始終在線的連接數據連接&#xff1a;數據傳輸&#xff0c;按需創建及關閉的連接數據傳輸格式&#xff1…

計算機應用基礎案例教程總結,計算機應用基礎案例教程

包杰軍等編著的《計算機應用基礎案例教程》以培養職業能力為目標&#xff0c;本著“做學合一”、“理論與實踐并行”、“知識與技能并重”的教育思想編寫。本書將實際操作案例與教學內容緊密結合&#xff0c;結構清晰、內容翔實、圖文并茂、實用性強。全書共分6章&#xff0c;第…

讓不支持h5新標簽的瀏覽器支持新標簽

把這段js加到頁面的頭部就可以了&#xff0c;創建想讓瀏覽器支持的標簽即可 //條件判斷是否支持 h5 if(window.applicationCache){alert("支持h5")}else{alert("不支持h5")document.createElement("article");document.createElement("head…

ios開發之--UIDocumentInteractionController的使用(實現更多分享服務)

最近在做項目的時候&#xff0c;碰到這樣一個需求&#xff0c;就是本地生成pdf文件&#xff0c;然后本地打開&#xff0c;經過測試發現&#xff0c;pdf文件是無法保存到相冊里面的&#xff0c;只能存到手機里面&#xff0c;鑒于蘋果的存儲機制&#xff0c;需要取出來&#xff0…

eclipse tomcat新建一個_Javaweb07-Eclipse自動創建動態web項目

學習筆記是參考的how2j使用Eclipse創建Dynamic Web Project前面的web項目都是通過手動創建的&#xff0c;現在使用eclipse EE自動創建動態web項目&#xff0c;熟悉一下創建流程&#xff0c;仍舊使用前面創建過的HelloServlet。需要注意的是&#xff0c;這里的tomcat版本變了&am…