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)插件(钩子)的简单实现机制

posted @ 2020-06-20 16:30  柔和的天空  阅读(665)  评论(0编辑  收藏  举报