上午研究了幾篇關(guān)于使用Hook實現(xiàn)鉤子的實例或詳細(xì)描述,總結(jié)了一些,所以打算寫兩個實例深入記憶。
注意事項:
注意事項:
1.觸發(fā)行為的關(guān)鍵方法是Hook類中的listen方法,它通過遍歷某個行為標(biāo)簽下的所有行為,依次實例化并調(diào)用run方法
2.listen方法中,如果之前在配置文件中開啟了DEBUG模式,則它會生成日志記錄你的行為,這里面牽涉到3.很多的IO操作,所以你的項目完成時建議取消DEBUG模式以提升速度
3.listen方法中,允許傳遞參數(shù)且只允許傳遞一個參數(shù)(傳多個可以用數(shù)組呢),不過這個參數(shù)是引用傳值,所以只能傳入變量,傳入常量會報錯
4.最后,Library\Think\Behavior.class.php,這個抽象類中只有一個抽象方法run(),在你的自己行為擴(kuò)展中建議繼承它,盡管這不是必須的,但是這樣更加規(guī)范
實例1
1.在控制器中 Application->Home->Controller->IndexController.class.php 添加如下代碼:
namespace Home\Controller;
use Think\Controller;
use Think\Hook;//引用Hook
class IndexController extends Controller {
public function index(){
Hook::add('ad','Behavior\\adBehavior'); //手動注冊行為 ad 是注冊行為的名稱 后面的是路徑 接下來會說如何新建路徑中的文件
hook::listen('ad',$parnam);//觸發(fā)行為 (這種是在控制器中觸發(fā)行為,還有在html頁面中觸發(fā)行為的 接下來就會看到) $parnam 為想要帶的參數(shù) 可以隨便定義 html中觸發(fā)的話請注釋這句
$this->display();
}
}
2.來新建一個行為取名叫ad(廣告),ThinkPHP->Library->Behavior->adBehavior.class.php
在里面寫入代碼:
namespace Behavior;
class adBehavior{
function run($arg){
//$arg為帶過來的參數(shù) 可以在其中寫入自己的業(yè)務(wù)邏輯 行為必須執(zhí)行run
echo '我是一條'.$arg['name'].'廣告,'.$arg['value'].'代言'; //在此介紹下,run必須的 ,細(xì)心的會在Think核心找到Behavior.class.php里面有這樣一句操蛋的話 abstract public function run(&$params); 你懂的
}
}
3.在模板中使用 Application->Home->View->Index->index.html 添加如下代碼:
<!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></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'=>'*老師'))} //這個呢就是在頁面中觸發(fā)行為的方式了
</body>
</html>
4.還需要一步 如果我們想在模板上調(diào)用例如{:tag('example',array('name'=>'name','value'=>'value'))} 這樣的方法,首先我們到 ThinkPHP->Common->functions.php,你會搜到 tag 這個方法,復(fù)制下 tag 方法,修改為
function hook($hook,$params=array()){
\Think\Hook::listen($hook,$params); //監(jiān)聽一個鉤子
}
實例1結(jié)束
實例2
實例一已經(jīng)夠詳細(xì)了實例二是根據(jù) http://www.itdecent.cn/p/7fa08fceea5b 修改的 比較簡潔 自動注冊就不在列舉
使用鉤子觸發(fā)行為擴(kuò)展的流程:
1.自動注冊(Common/Conf/tags.php按格式自己添加),或者 手動注冊(類中方法如初始方法,調(diào)用Hook::add(tags,name));
2.寫好自己的行為類,類名以Behavior結(jié)尾,實現(xiàn)run方法
3.在需要添加行為的函數(shù)里 ,直接Hook::Listen(tags,prarm),注意一定要傳變量,不需要傳常量。
例子:
Home\IndexController;中代碼:
public function index()
{
//這里我是手動注冊的行為
Hook::add('ads','Home\Behaviors\adsBehavior');//ads 為行為名稱 后面的是路徑
hook::listen('ads',$param); //這個是監(jiān)聽觸發(fā)行為 $param為傳遞的參數(shù) 可自定義
}
}
新建 Home\Behaviors\adsBehavior.php
寫入代碼:
<?php
namespace Home\Behavior;
class adBehavior{
function run(&$param){
dump($param);
//在這里面寫邏輯代碼即可
//在此介紹下,run必須的 ,細(xì)心的會在Think核心找到Behavior.class.php里面有這樣一句操蛋的話
//abstract public function run(&$params); 你懂的
}
}
OK,完成,剛剛超過下班2分鐘。愉快下班。