濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > thinkphp的鉤子的兩種配置和兩種調(diào)用方法

thinkphp的鉤子的兩種配置和兩種調(diào)用方法

熱門(mén)標(biāo)簽:安裝電銷(xiāo)外呼系統(tǒng) 常州地圖標(biāo)注服務(wù)商 新河科技智能外呼系統(tǒng)怎么樣 衡水外呼系統(tǒng)平臺(tái) 注冊(cè)400電話申請(qǐng) 福州人工外呼系統(tǒng)哪家強(qiáng) 百度商鋪地圖標(biāo)注 釘釘打卡地圖標(biāo)注 地圖標(biāo)注平臺(tái)怎么給錢(qián)注冊(cè)

thinkphp的鉤子行為類(lèi)是一個(gè)比較難以理解的問(wèn)題,網(wǎng)上有很多寫(xiě)thinkphp鉤子類(lèi)的文章,我也是根據(jù)網(wǎng)上的文章來(lái)設(shè)置thinkphp的鉤子行為的,但根據(jù)這些網(wǎng)上的文章,我在設(shè)置的過(guò)程中,嘗試了十幾次都沒(méi)有成功,不過(guò),我還是沒(méi)有放棄,最后還是在一邊調(diào)節(jié)細(xì)節(jié),一邊試驗(yàn)的過(guò)程中實(shí)現(xiàn)了鉤子行為的設(shè)置。下面是我個(gè)人的設(shè)置經(jīng)驗(yàn),在這里跟大家分享一下。

個(gè)人做了兩種設(shè)置,都試驗(yàn)成功了,一個(gè)簡(jiǎn)單點(diǎn),在thinkphp的核心文件中模仿核心行為類(lèi)添加了另一個(gè)行為類(lèi),下面是截圖:

我的虛擬主機(jī)配置文件夾是D:/think

Thinkphp是tp框架文件夾,配置過(guò)tp框架應(yīng)該都知道Library是tp放核心文件的文件夾,Behavior文件夾則是tp的鉤子行為類(lèi)文件的核心文件夾,里面放置著很多行為類(lèi)文件,我只是模仿這些鉤子行為類(lèi)文件在里面建了一個(gè)鉤子行為類(lèi)文件adBehavior.class.php,內(nèi)容如下:

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

設(shè)置好了自定義的鉤子行為類(lèi)之后,我們接下來(lái)就要利用這個(gè)鉤子行為類(lèi)促發(fā)鉤子的行為了,```鉤子的行為```說(shuō)白了其實(shí)就是促發(fā)鉤子行為類(lèi)的run方法里面的代碼執(zhí)行,我這里只是簡(jiǎn)單的輸出run方法參數(shù)的內(nèi)容,在應(yīng)用中的,大家可以自由發(fā)揮。

下面是促發(fā)行為的操作:

解釋一下:我這里是Home模塊下面的IndexController控制器的登錄方法

namespace Home\Controller;
use Think\Controller;
use Think\Hook;//引進(jìn)促發(fā)鉤子行為的類(lèi),是為下面的Hook::add()調(diào)用做伏筆的
class IndexController extends Controller {
 public function login(){
 //這里我設(shè)置一個(gè)ad行為的標(biāo)簽,也就是給我自定義的adBehavior鉤子行為類(lèi)添加一個(gè)促發(fā)行為的標(biāo)識(shí)
 Hook::add('ad','Behavior\\adBehavior');
 //第一個(gè)是執(zhí)行標(biāo)簽的名稱(chēng),第二個(gè)參數(shù)是行為的類(lèi)的地址
 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模板內(nèi)容:

!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)擴(kuò)展以及插件(Plug or Hook)詳解(含實(shí)例)
 /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函數(shù)第一個(gè)參數(shù)是標(biāo)簽的名稱(chēng),第二個(gè)參數(shù)隨意-->
 !--tag函數(shù)第一個(gè)參數(shù)是標(biāo)簽的名稱(chēng),第二個(gè)一定是變量,因?yàn)閠ag函數(shù)是引址傳遞的參數(shù)-->
div>hook函數(shù):{:hook('test', array('name'=>'World'))}hr/>/div>
div>tag函數(shù):{:tag('mv',$param)}hr/>/div>
hr/>
div>tag函數(shù):{:tag('action_begin',$param)}/div>
/body>
/html>

這里的路徑我就不寫(xiě)了吧,一般對(duì)tp框架了解的人都知道,這個(gè)模板login.html放在哪里。

關(guān)于這個(gè)模板的內(nèi)容,我已經(jīng)提前把下面要講述的另一種設(shè)置鉤子行為類(lèi)方法的內(nèi)容也放在這里了,大家可以自行測(cè)試一下調(diào)用這個(gè)模板,如果你跟著我的思路設(shè)置了,我想它應(yīng)該會(huì)輸出。

廢話不多說(shuō),下面是第二種自己設(shè)置行為類(lèi)的方法,這里我是根據(jù)tp框架的手冊(cè)以及諸位網(wǎng)友的網(wǎng)文自己測(cè)試成功了的,大家按照我的思路設(shè)置就行了。只有你配置對(duì)了,我想應(yīng)該不會(huì)出現(xiàn)太多問(wèn)題。  

  1. 首先在你的模塊下面建一個(gè)文件夾Behaviors,再在Behaviors里面創(chuàng)建自定義的鉤子行為類(lèi),鉤子行為類(lèi)必須是xxxBehaviors.class.php的格式?! ?/li>
  2. 其次在你的模塊下面的Conf文件夾中新增一個(gè)文件tags.php。  為什么要這樣,這是tp的語(yǔ)法,你照做就行了,當(dāng)然你自己也可以探究一下?! ∵@樣子說(shuō)或許還不夠形象,下面我還是上代碼吧,本人描述比較差。  先截個(gè)圖顯示路徑吧,免得有的同學(xué)還是摸不著頭腦。

解釋一下上面的文件夾,Conf文件夾有的tp會(huì)自動(dòng)生成,有的可能要你新建,Behaviors文件夾則是要你新建的,下面還是上代碼:在Behaviors文件夾里面(完整路徑D:\think\application\Home\Behaviors\testBehavior.class.php)我自定義的鉤子行為類(lèi)的內(nèi)容:

?php
/**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/7/17
 * Time: 11:02
 */
namespace Home\Behaviors;
/*
 * 注冊(cè)鉤子行為類(lèi),要觸發(fā)的行為寫(xiě)在run函數(shù)里
 * */
class testBehavior extends \Think\Behavior{
 public function run($arg){
 echo 'test behavior=====下一行是參數(shù)br/>'.$arg['name'];
 }
}

在Conf文件夾里面(完整路徑D:\think\application\Home\Conf\tags.php,當(dāng)然這是我的情況)tags.php的內(nèi)容:

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

解釋一下,上面tags.php文件的內(nèi)容,我配置了兩個(gè)行為標(biāo)識(shí),``action_begin``,``mv``,是跟login.html那里相對(duì)應(yīng)的,你可以回去仔細(xì)查看一下,login.html模板的內(nèi)容,必定包含有``action_begin``,``mv``,這里也是tp框架在tags.php設(shè)置行為標(biāo)識(shí)的語(yǔ)法,要是想問(wèn)為什么可以自行探究,這里不多說(shuō)。

還有請(qǐng)注意:上面那個(gè)被我注釋掉的‘a(chǎn)ction_begin',其實(shí)是我的版本不適合這個(gè)語(yǔ)法,這是其他版本在tags.php配置行為標(biāo)識(shí)的語(yǔ)法,這里tp里面的文檔說(shuō)的比較清楚,我就不多說(shuō)了。如果,你的版本和我不同,那么請(qǐng)用上面的語(yǔ)法嘗試一下,如果用上面的語(yǔ)法配置還是沒(méi)辦法配置成功,那么可能是你配置錯(cuò)了。

配置好了,那么請(qǐng)你再?lài)L試調(diào)用模板login.html。我相信你一定能獲得你想要的配置結(jié)果的。

這里提醒一句,請(qǐng)認(rèn)真看我所做的注釋?zhuān)抢锟梢哉f(shuō)也包含了很多信息。

接下來(lái),我要講講設(shè)置監(jiān)聽(tīng)鉤子行為類(lèi)的兩個(gè)方法hook(),tag():

這兩個(gè)函數(shù)都是tp內(nèi)置監(jiān)聽(tīng)鉤子行為類(lèi)的內(nèi)置函數(shù),可以在tp框架的函數(shù)庫(kù)functions.php文件中找得到。這里只講他們的調(diào)用區(qū)別,其實(shí)已經(jīng)在login.html模板文件中提到了,這里就再次說(shuō)明一下:

兩個(gè)函數(shù)在functions.php的代碼:

/**
 * 獲取和設(shè)置配置參數(shù) 支持批量定義
 * @param string|array $name 配置變量
 * @param mixed $value 配置值
 * @param mixed $default 默認(rèn)值
 * @return mixed
 */
function hook($hook,$params=array()){
 \Think\Hook::listen($hook,$params); //監(jiān)聽(tīng)一個(gè)鉤子
}

/**
 * 處理標(biāo)簽擴(kuò)展
 * @param string $tag 標(biāo)簽名稱(chēng)
 * @param mixed $params 傳入?yún)?shù)
 * @return void
 */
function tag($tag, $params=NULL) {
 \Think\Hook::listen($tag,$params);
}

之所以在這里展示一下這兩個(gè)函數(shù)的內(nèi)容,是為了解釋它們的區(qū)別:

細(xì)心的你應(yīng)該發(fā)現(xiàn)tag函數(shù)的$param參數(shù)值里前面帶了一個(gè)······符號(hào),沒(méi)有錯(cuò):這個(gè)符號(hào)就是引用變量的地址符號(hào),所以tag函數(shù)的$param參數(shù)只能是變量,請(qǐng)不要懷疑,你可以測(cè)試一下不是變量的情況,呵呵。

它們的區(qū)別也在于此,hook可以引用任何參數(shù),tag只能引用變量的參數(shù)

上面那個(gè)tags.php文件里面我在每個(gè)標(biāo)簽行為的后面都重復(fù)配置了testBehavior自定義類(lèi),是為了證明,一個(gè)標(biāo)簽也可以對(duì)應(yīng)多個(gè)行為類(lèi),如果你配置成功了,那么你運(yùn)行l(wèi)ogin.html的時(shí)候,肯定發(fā)現(xiàn)login根據(jù)testBehavior設(shè)置的執(zhí)行了兩次。

最后,總結(jié)一下:

tp框架的鉤子行為類(lèi)無(wú)非就是為了在某個(gè)特定地點(diǎn),特定時(shí)間促發(fā)某種行為,這個(gè)是應(yīng)用很廣的,本人姑且這么認(rèn)為。比如,你想要在某個(gè)模板植入廣告,可以向我這樣子簡(jiǎn)單的設(shè)置。然后,簡(jiǎn)單的介紹tp行為的引用步驟:

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

其次是促發(fā)的行為,你必須在你自定義的行為類(lèi)的run里面設(shè)置,在這里實(shí)現(xiàn)你的任何行為,run方法就是你配置行為的地方。

然后,就是配置tags.php的行為標(biāo)識(shí)了

這里你可以按照上面格式配置,當(dāng)然,你有沒(méi)有細(xì)心的發(fā)現(xiàn)上面的IndexController.class.php里面我多寫(xiě)了幾行代碼:

//第一個(gè)是執(zhí)行標(biāo)簽的名稱(chēng),第二個(gè)參數(shù)是行為的類(lèi)的地址
 Hook::add('test', "Home\\Behaviors\\testBehavior");

其實(shí)這里是動(dòng)態(tài)添加行為標(biāo)識(shí)的代碼,也就是說(shuō),鉤子行為的標(biāo)簽行為,也就是標(biāo)識(shí)也可以動(dòng)態(tài)添加的,你可以試試。

最后,就是監(jiān)聽(tīng)行為了,監(jiān)聽(tīng)行為就是引用tag方法或者h(yuǎn)ook方法了,在這里你可以傳入?yún)?shù),也可不傳,看你想怎么做了。監(jiān)聽(tīng)行為你可以在模板上監(jiān)聽(tīng),也可以在其他地方監(jiān)聽(tīng),比如控制器的方法中,這里就不舉例了,你可以自己試試,我之所以在模板中舉例,完全是為了看到效果,畢竟做實(shí)驗(yàn)看不到你要的結(jié)果,是證明不了你的實(shí)驗(yàn)是個(gè)成功的實(shí)驗(yàn)的。

到此這篇關(guān)于thinkphp的鉤子的兩種配置和兩種調(diào)用方法的文章就介紹到這了,更多相關(guān)thinkphp的鉤子內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • ThinkPHP 5.x遠(yuǎn)程命令執(zhí)行漏洞復(fù)現(xiàn)
  • ThinkPHP框架任意代碼執(zhí)行漏洞的利用及其修復(fù)方法
  • 對(duì)于ThinkPHP框架早期版本的一個(gè)SQL注入漏洞詳細(xì)分析
  • ThinkPHP的標(biāo)簽制作實(shí)例講解
  • phpstudy的安裝及ThinkPHP框架的搭建圖文講解
  • ThinkPHP6.0 重寫(xiě)URL去掉Index.php的解決方法
  • ThinkPHP6通過(guò)Ucenter實(shí)現(xiàn)注冊(cè)登錄的示例代碼
  • Thinkphp5+Redis實(shí)現(xiàn)商品秒殺代碼實(shí)例講解
  • 如何從防護(hù)角度看Thinkphp歷史漏洞

標(biāo)簽:遼陽(yáng) 克拉瑪依 鷹潭 六安 柳州 白城 唐山 鶴崗

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《thinkphp的鉤子的兩種配置和兩種調(diào)用方法》,本文關(guān)鍵詞  thinkphp,的,鉤子,兩種,配置,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《thinkphp的鉤子的兩種配置和兩種調(diào)用方法》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于thinkphp的鉤子的兩種配置和兩種調(diào)用方法的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    东兰县| 广州市| 衡南县| 容城县| 卢湾区| 桐柏县| 雷山县| 清丰县| 湟中县| 中方县| 喜德县| 武穴市| 肥乡县| 雷州市| 唐海县| 郑州市| 大英县| 色达县| 普兰店市| 安宁市| 娄底市| 汉源县| 山丹县| 新疆| 长岭县| 开阳县| 桐梓县| 精河县| 东港市| 彭泽县| 金华市| 辽宁省| 中卫市| 平邑县| 松江区| 永顺县| 长治市| 庐江县| 云梦县| 武宣县| 那坡县|