ThinkPHP5.1 行爲與鉤子

文件目錄

閉包方式調用鉤子

閉包傳參調用

行爲鉤子綁定

行爲鉤子綁定傳參

tage 文件統一定義行爲

直接執行行爲

行爲變量模板賦值

模板中調用鉤子

最後總結

 

文件目錄

 

 

閉包方式調用鉤子

\application\pub\tags.php

return [
    //接口初始化
    'app_init'      => ['app\\pub\\behavior\\Upfile'],
];

控制器文件: \application\pub\controller\Upfile.php

namespace app\pub\controller;
use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        // 可以不用定義行爲直接把閉包函數綁定到某個標籤位
        Hook::add('app_init',function(){
            echo '閉包調用';
        });
        hook::listen('app_init');
    }
}

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯
    public function run()
    {
        echo "run 入口";
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit()
    {
       echo "初始化";
    }
}

沒有 appInt() 方法時,自動調用 run() 方法。

如果存在 appInt() 方法,只調用appInt() 方法,不調用 run() 方法

閉包裏的數據最後調用。

 

閉包傳參調用

\application\pub\tags.php 文件同上

控制器文件: \application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        $params = ['username' => 'liaosp'];
        Hook::add('app_init',function($params){
            echo "<br/>".' 閉包輸出參數:'.$params['username'];
        });
        Hook::listen('app_init',$params);
    }
}

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯
    public function run($params)
    {
         echo "run 入口輸出參數: ".$params['username'];
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit($params)
    {
        echo '初始化輸出參數:'.$params['username'];
    }
}

 

行爲鉤子綁定

控制器文件:\application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        Hook::add('app_init','app\\pub\\behavior\\Upfile'); //手動註冊行爲 app_init 是註冊行爲的名稱 後面的是行爲文件路徑
        Hook::listen('app_init');
    }
}

行爲文件多個用數組表示,如果其中一個行爲中有中止代碼的話則後續不會執行,如果返回 false 則當前標籤位的後續行爲將不會執行,但應用將繼續運行。

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run()
    public function run()
    {
         echo "run 入口";
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit()
    {
        echo '初始化';
    }
}

 

行爲鉤子綁定傳參

控制器文件:\application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        Hook::add('app_init','app\\pub\\behavior\\Upfile'); //手動註冊行爲 app_init 是註冊行爲的名稱 後面的是路徑
        $param['name']='aaa';
        Hook::listen('app_init',$param);
    }
}

行爲文件多個用數組表示,如果其中一個行爲中有中止代碼的話則後續不會執行,如果返回 false 則當前標籤位的後續行爲將不會執行,但應用將繼續運行。

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run()
    public function run($param)
    {
         echo "run 入口:".$param['name'];
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit($param)
    {
        echo '初始化:'.$param['name'];
    }
}

 

tage 文件統一定義行爲

\application\pub\tags.php

return [
    //接口初始化
    'app_init'      => ['app\\pub\\behavior\\Upfile'],
];

一個標籤位可以綁定多個行爲

控制器文件:\application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        $param['name']='aaa';
        Hook::listen('app_init',$param); // 參數不是必選
    }
}

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run()
    public function run($param)
    {
         echo "run 入口:".$param['name'];
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit($param)
    {
        echo '初始化:'.$param['name'];
    }
}

 

直接執行行爲

直接執行行爲的時候,執行的是run方法

$param['name']='aaa';
Hook::exec('app\\pub\\behavior\\Upfile',$param);// 參數不是必傳

如果需要執行行爲類的其它方法,可以使用

$param['name']='aaa';
Hook::exec(['app\\pub\\behavior\\Upfile','appInit'], $param);// 參數不是必傳

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run()
    public function run($param)
    {
         echo "run 入口:".$param['name'];
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫)。
    public function appInit($param)
    {
        echo '初始化:'.$param['name'];
    }
}

 

行爲變量模板賦值

控制器文件:\application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        $param=array("red","green","blue","yellow","brown");
        $result=Hook::listen('app_init',$param);// 返回數據類型爲數組類型
        $this->assign('hook',$result[0]); // 變量傳遞,模板中調用{$hook}
        return $this->fetch();
    }
}

鉤子定義: \application\pub\tags.php

return [
    //接口初始化
    'app_init'      => ['app\\pub\\behavior\\Upfile'],
];

一個標籤位可以綁定多個行爲

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run(),業務處理
    public function run($param)
    {
         return "run 入口:".implode(',',$param);
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫),業務處理
    public function appInit($param)
    {
        echo '初始化:'.implode(',',$param);
    }
}

 

模板中調用鉤子

控制器文件:\application\pub\controller\Upfile.php

namespace app\pub\controller;

use think\Controller;
use think\facade\Hook;

class Upfile extends Controller
{
    public function index(){
        return $this->fetch();
    }
}

 

行爲文件:\application\pub\behavior\Upfile.php

namespace app\pub\behavior;

class Upfile
{
    // 行爲邏輯 如果沒有appInit() 方法,自動執行 run(),業務處理
    public function run($param)
    {
         return "run 入口:".implode(',',$param);
    }
    //方法名就是鉤子名稱的駝峯命名(首字母小寫),業務處理
    public function appInit($param)
    {
        echo '初始化:'.implode(',',$param);
    }
}

 

公共函數方法: \application\common.php

function hook($hook,$params=array()){
    \think\facade\Hook::listen($hook,$params);        //監聽一個鉤子
}

 

模板中調用

{:hook('app_init', array('name'=>'AV'))}

 

 

最後總結:

  • 調用行爲會執行 標籤名方法(方法名就是鉤子名稱的駝峯命名(首字母小寫)),如果沒有標籤名的鉤子方法,自動調用 run() 方法,最後處理閉包裏的業務。

  • 行爲文件中的方法 return 返回的數據類型是數組類型

  • 模板中使用 :hook,需要在公共函數文件中定義hook 監聽鉤子

 

相關文章:Thinkphp實戰利用鉤子使用行爲擴展 (Hook)

   tp(php)插件(鉤子)的簡單實現機制

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章